Я пытаюсь создать конечную точку, которая пересылает данные, переданные ей, в 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
не существует.
Кто-нибудь знает, что мне не хватает или что-то не так?
Тело, которым вы являетесь 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()
мы читаем все содержимое и ничего не осталось для второго вызова .