17

Slim PHP フレームワークを使用して、渡されたデータを API に転送するエンドポイントを構築しようとしていますが、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' => 'foo' ],
        ]
    ]);

    $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=foo.

別のリクエストがありますが、使用するだけで$client->post(...)、ストリームを返さずに正常に動作します。

下部の例 ( http://guzzle.readthedocs.org/en/latest/http-client/response.html )を使用してストリームを読み取ろうとしましたfeofが、存在しないと表示されます。

ここで何が欠けているのか、間違っているのか誰にも分かりますか?

4

4 に答える 4

13

私は同じ問題を抱えていました.getBodyがストリームである場合、つまりポインターがあることを意味します.getContentsを実行すると、ファイルの最後にポインターが残ります。つまり、取得したい場合ポインタを 0 に戻す必要があるため、本体を複数回検索します。

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

これはうまくいくはずです:)

@mrWこれがお役に立てば幸いです

于 2015-09-10T08:56:42.180 に答える
9

あなたが var_dumping している本体は、Guzzle ストリーム オブジェクトです。このオブジェクトは、文字列のように扱うことも、必要に応じて読み取ることもできます。Guzzle Stream のドキュメントはこちら

于 2014-04-03T16:01:34.433 に答える
3

ちょうど奇妙な状況がありました。body コンテンツを取得できるのは 1 回だけであることに注意してください。

を呼び出すたびに同じコンテンツを取得することを期待していましたgetContents()

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

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

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

しかし、そうではありません!Guzzle の応答がstream最初getContents()にすべてのコンテンツを読み取り、2 番目の呼び出しには何も残っていないという情報を見逃していました。

于 2015-04-26T15:17:33.460 に答える