Подтвердить что ты не робот

Не ожидая ответа от Guzzle

Я пытаюсь создать конечную точку, которая пересылает данные, переданные ей в API, используя Slim PHP Framework, и мне не удается получить ответ от запроса Guzzle.

$app->map( '/api_call/:method', function( $method ) use( $app ){
    $client = new GuzzleHttp\Client([
        'base_url' => $app->config( 'api_base_url' ),
        'defaults' => [
            'query'   => [ 'access_token' => 'penises' ],
        ]
    ]);

    $request = $client->createRequest( $app->request->getMethod(), $method, [
        'query' => $app->request->params()
    ]);

    var_dump( $client->send( $request )->getBody() );

})->via( 'GET', 'POST', 'PUT', 'PATCH', 'DELETE' )->conditions( [ 'route' => '.+?' ] );`

Это тогда дает мне...

object(GuzzleHttp\Stream\Stream)[59]
  private 'stream' => resource(72, stream)
  private 'size' => null
  private 'seekable' => boolean true
  private 'readable' => boolean true
  private 'writable' => boolean true
  private 'meta' => 
    array (size=6)
     'wrapper_type' => string 'PHP' (length=3)
      'stream_type' => string 'TEMP' (length=4)
      'mode' => string 'w+b' (length=3)
      'unread_bytes' => int 0
      'seekable' => boolean true
      'uri' => string 'php://temp' (length=10)

... вместо ответа "классного" я ​​ожидал.

Если я просто var_dump $client->sendRequest( $request ), я получаю 200 OK, а url - то, что я ожидаю, http://localhost:8000/test?access_token=penises.

У меня есть другой запрос, но только с помощью $client->post(...) и он отлично работает, не возвращая мне поток.

Я пробовал читать поток, используя пример внизу (http://guzzle.readthedocs.org/en/latest/http-client/response.html), но он сказал мне, что feof не делает существуют.

Кто-нибудь знает, что мне не хватает или что-то не так?

4b9b3361

Ответ 1

Тело, которым вы являетесь var_dumping, является объектом потока Guzzle. Этот объект можно рассматривать как строку или читать по мере необходимости. Документация для Gozzle Stream здесь

Ответ 2

Может быть:

$response = $client->send($request)->getBody()->getContents();
$response = $client->send($request)->getBody()->read(1024*100000);

Это также работает как сокращение,

$response = ''. $client->send($request)->getBody();
$response = (string) $client->send($request)->getBody();

//см. метод __toString() для последних примеров: http://php.net/manual/en/language.oop5.magic.php#object.tostring

Ответ 3

У меня была такая же проблема, и дело в том, что если вы getBody его поток, что означает, что у него есть указатель, когда вы делаете getContents на нем, он оставляет указатель в конце файла, а это означает, что если вы хотите получить тело несколько раз, вам нужно вернуть указатель на 0.

$html1 = $this->response->getBody()->getContents();
$this->response->getBody()->seek(0);
$html2 = $this->response->getBody()->getContents();
$this->response->getBody()->seek(0);

Это должно работать:)

@mrW Надеюсь, это поможет вам

Ответ 4

Просто была странная ситуация. Обратите внимание: вы можете получать контент тела только один раз!

Я ожидал получить тот же контент каждый раз, когда я вызываю getContents().

$html1 = $this->response->getBody()->getContents();
$html2 = $this->response->getBody()->getContents();

$same = ($html1 == $html2);

strlen($html1); //x
strlen($html2); //0

Но это не так! Я пропустил информацию о том, что ответ Guzzle stream, поэтому при первом getContents() мы читаем все содержимое и ничего не осталось для второго вызова.