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