Команда Yii выпустила официальное расширение-клиент HTTP. Написано почти целиком Павлом Климовым. До последнего времени не было тегнуто как релиз из за несовместимости с PSR-7, хотя уже много где использовалось. После долгих обсуждений было решено выпускать без PSR-7. К нему, возможно, вернутся в 2.1.x.


Выполнение HTTP запроса выглядит вот так:


use yii\httpclient\Client;

$client = new Client();
$response = $client->createRequest()
    ->setMethod('post')
    ->setUrl('http://example.com/api/1.0/users')
    ->setData(['name' => 'John Doe', 'email' => 'johndoe@domain.com'])
    ->send();
if ($response->isOk) {
    $newUserId = $response->data['id'];
}

https://github.com/yiisoft/yii2-httpclient

Поделиться с друзьями
-->

Комментарии (37)


  1. affka
    01.07.2016 18:38
    -1

    Шикардос! :)


  1. Alland456
    10.11.2016 16:14
    -3

    На досуге, посмотрите фильм «Масло Лоренцо». Основан на реальных событиях.
    Вкратце, фильм о том, что поражённые и разочарованные некомпетентностью медиков, родители решают сами искать средство лечения для своего угасающего на глазах сына. Причем, оба были очень далеки от медицины. И в результате они нашли способ победить болезнь. Их сыну это уже правда не помогло, но это позволило спасти тысячи других детей, дать им возможность нормально жить, расти, развиваться. Тем, кому профессора медицины, практики, которые много много лет изучали, продвигали, практиковали медицину, так и не смогли бы помочь.


    1. QuickStudio
      01.07.2016 20:34
      +6

      конечно, избавиться. Почти каждый сторонний пакет тянет за собой guzzle


    1. XoJIoD
      10.11.2016 16:48
      -1

      Видимо книга Брайана Грина «Ткань космоса» (а судя по иллюстрациям автор вдохновлялся ей) каждого читателя подталкивает на эту идею) Я, в своё время, тоже после её прочтения описал эту идею, правда не так развернуто, Арутюнову Константину Юрьевичу из ВШЭ. Но толи мы друг друга не поняли, толи он уже устал отвечать на подобные вопросы, потому что в конечном итоге он перестал мне отвечать) Так что вместе с автором жду опровержения от более подкованных в матчасти товарищей


  1. QDeathNick
    10.11.2016 16:53

    Ну, если это всё ещё подписать ЭЦП, чтобы пришёл человек, вы уже после этого генерируете подпись, и сличаете с той, что он принёс. :)
    После этого можно было бы и подписать, только зачем? Ведь если вы не подпишите, всё равно всё уже будет создано, ведь он пришёл.


    1. maxtm
      01.07.2016 22:54
      +2

      И чем же плох cURL?


      1. VGrabko
        01.07.2016 23:06
        -6

        он прожорлив


        1. eskrano
          01.07.2016 23:11

          Альтернативы?


        1. maxtm
          01.07.2016 23:23

          в сравнении с чем? есть что-то лучшее?
          только не говорите про fsockopen…


    1. SamDark
      01.07.2016 23:23

      Из коробки два транспорта: CURL и stream. Можно написать свои при желании.


  1. eskrano
    01.07.2016 22:54
    +6

    Зачем придумывать велосипед если уже есть? Но судя по коду, вижу, что удобненько. А судя по комментариям согласшусь на счет GUZZLE.


    1. springimport
      02.07.2016 01:20

      Чем так плох Guzzle?


      1. SamDark
        02.07.2016 01:21

        Он не плох, но тяжёл как в плане зависимостей, так и в плане API.


        1. Borro
          02.07.2016 16:59
          +3

          А ваш требует yii2, поэтому просто так его не подключить. Кстати, не вижу, чтобы у Guzzle было много зависимостей:
          — guzzlehttp/guzzle
          — — guzzlehttp/promises
          — — guzzlehttp/psr7
          — — — psr/http-message


          1. SamDark
            02.07.2016 17:13
            -3

            Так его и будут использовать с Yii 2.0. Он по другому и не может работать...


            1. symbix
              02.07.2016 21:14

              А зачем делать завязку на фреймворк там, где без нее спокойно можно обойтись?

              Вообще аргументы странные. Объем (хотя не вижу ничего объемного) — ну, не знаю, мне что-то прямо вспоминается, как заливал HTML на 14400 по фтп на хостинг с 2 Мб места. API кажется тяжелым — можно сделать фасад/адаптер.

              Мне кажется, дело в другом — у Guzzle найден фатальный недостаток :-)


              1. SamDark
                02.07.2016 21:28

                Посмотрите исходник. Нельзя там просто так обойтись не продублировав yii\web\Cookie и yii\web\HeaderCollection, которые в фреймворке уже есть.


                Я ни разу не говорил про размер на диске.


                API кажется тяжелым — можно сделать фасад/адаптер.

                Так это он и есть. Хотите — реализуйте драйвер, который будет использовать Guzzle.


                1. Borro
                  02.07.2016 21:34

                  выделите yii\web\Cookie и yii\web\HeaderCollection в отдельные модули и избавитесь от дублирования кода. Мне вот нравится AR Yii, но просто так её не получится использовать, т.к. нужно тащить весь фреймворк.


                  1. Stalker_RED
                    10.11.2016 23:57

                    Почему только на микро? На спутниках GPS регулярно корректируют часы, т.к. спутники движутся быстрее чем поверхность земли. Вполне себе макро объект.


  1. grishkaa
    02.07.2016 06:28
    -4

    Ведь использовать file_get_contents было бы слишком просто.


    1. Igogo2012
      02.07.2016 13:31
      -5

      Особенно если нужно оправить данные методом POST


      1. grishkaa
        02.07.2016 18:13
        +6

        Вы не поверите...

        Но можете минусовать дальше, конечно. Законом не запрещено.


    1. mnv
      02.07.2016 13:32
      -1

      Как с file_get_contents() например настроить таймаут на ожидание ответа?


      1. Borro
        02.07.2016 16:46
        +6

        Конечно, для этого нужно добавить контекст

        file_get_contents('http://ya.ru', false, stream_context_create(['http' => ['timeout' => 5.5]]));
        

        context.http.timeout



    1. SamDark
      02.07.2016 18:44
      +1

      Для него и обёртка...


  1. saggid
    02.07.2016 10:15

    На данный момент использую уже несколько лет php-curl-class, и вроде вполне доволен.


  1. maslyaev
    10.11.2016 20:56

    И даже если мы не сможем путешествовать во времени, мы ведь можем искать следы этих изменений.

    Собственно, так мы всю жизнь и делаем. И очень в этом поднаторели ;)

    Такая точка зрения на время — вовсе не моё изобретение. В первый раз я с такими рассуждениями столкнулся в книжке Дэвида Дойча «Структура реальности». Но вообще, в целом похожие рассуждения о времени есть у Канта в КЧР. Эйнштейн, кстати, эту книжку зело уважал.

    На физиологию я бы особо не завязывался. Очень большой риск нарваться на логическую петлю.


    1. SamDark
      02.07.2016 17:14

      Не замена. Просто есть моменты, для которых нужно что-то попроще...


  1. G1K
    02.07.2016 17:14
    +1

    Отличная новость, спасибо автору! По коду и примерам просто и удобно.

    Расширить доки и добавить на русском было бы неплохо.


  1. L0NGMAN
    04.07.2016 02:24

    Я тоже сомневаюсь что стоит разработывать велосипеды когда есть уже готовые и главное — хорошые решения. Ведь все используют Guzzle…


    1. SamDark
      04.07.2016 12:08

      Мы тоже сомневались, но 13000 установок убедили нас...


      1. EvgK
        11.11.2016 23:11

        Но мы можем отложить это решение прямо в эксперименте из статьи, однако на экране никогда не будет интерференции (независимо от того, когда мы детектируем холостые, и детектируем ли вообще). Возможно вы имеете в виду не двухщелевую (интеренфереционную) картину, а наоборот? Тогда все верно.


        1. SamDark
          05.07.2016 23:58
          +1

          А при чём тут цифры Guzzle всех версий с 2011 года? Несомненно, библиотека очень популярная, но она не единственная. Люди пользуются buzz, zend-http, httpful и так далее. Мы сделали довольно тонкую обёртку с двумя простыми драйверами. Драйвер под Guzzle тоже можно сделать. Цифры для не релизнутого расширения вполне нормальные. Например, вот Sphinx: https://packagist.org/packages/yiisoft/yii2-sphinx


  1. sanchezzzhak
    04.07.2016 12:08

    нету поддержки multi curl или я не увидел
    лично я использую khr/php-mcurl-client для мульти отправки
    для обычной рутины самопал codepaste.net/g92i1n
    метод send, если честно взбесил, можно сделать отправку на конечных методах (get put post delete)


    1. Zhuravljov
      04.07.2016 15:30
      +1

      нету поддержки multi curl или я не увидел

      Есть. Будет работать асинхронно если использовать CurlTransport.


      1. sanchezzzhak
        06.07.2016 15:24

        спасибо, пока модерировали комментарий полазил по коду и доке нашел отправку, прошу не учитывать мое мнение выше в комментарии оно не актуально.