Не ожидая ответа от 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 ) client- $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 не существует.

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

Solutions Collecting From Web of "Не ожидая ответа от Guzzle"

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

Может быть;

 $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

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

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

Это должно работать 🙂

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

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

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

 $html1 = $this->response->getBody()->getContents(); $html2 = $this->response->getBody()->getContents(); $same = ($html1 == $html2); strlen($html1); //x strlen($html2); //0 

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