2

laravel 5 で guzzle 6 を使用して投稿リクエストを送信していますが、投稿リクエストを処理するメソッドで request() にアクセスしようとすると、ERR_INVALID_CHUNKED_ENCODING が発生します。

これが私のコードです:

Routes.php

Route::get('/guzzle', [
    'as'   => 'guzzle-test',
    'uses' => 'TestController@getTest'
]);

Route::post('/guzzle', [
   'as'   => 'guzzle-post-test',
   'uses' => 'TestController@postTest'
]);

TestController.php

public function getTest()
{
    $client = new Client();

    $data = [
        'hey' => 'ho'
    ];

    $request = $client->post(route('guzzle-post-test'), [
        'content-type' => 'application/json'
    ], json_encode($data));

    return $request;
}

public function postTest()
{
    dd(getTest());
}

文字列をダイダンプしようとしてそこにたどり着いたので、ポストリクエストハンドラーにたどり着きましたが、を呼び出すと、request()そのエラーが発生します。私が調査したことについては、コンテンツの長さに何か関係があるかもしれませんが、guzzle のドキュメントや Web 上のいくつかのものを読んだ後、リクエストでコンテンツの長さを適切に取得して渡す方法を見つけることができました。どんな助けでも大歓迎です!

4

1 に答える 1

3

まず、目的に合わせて調整できるはずのテスト コードをいくつか示します ( form_paramsGuzzleHttp のドキュメントも参照してください)。

public function validateRecaptcha()
{
    $client = new Client;
    $response = $client->request('POST', 'https://www.google.com/recaptcha/api/siteverify', [
            'form_params' => [
                'secret' => env('RECAPTCHA_SECRET'),
                'response' => Request::input('g-recaptcha-response'),
                'remoteip' => Request::ip()
            ]
    ]);

    return $response;
}

私はちょうど同じ問題に遭遇し、Laravel で応答オブジェクトを返そうとすると、ERR_INVALID_CHUNKED_ENCODING. 一方、dd()応答自体を実行すると、実際に見たいものがわかりました。

public function validateRecaptcha()
{
    $client = new Client;
    $response = $client->request('POST', 'https://www.google.com/recaptcha/api/siteverify', [
            'form_params' => [
                'secret' => env('RECAPTCHA_SECRET'),
                'response' => Request::input('g-recaptcha-response'),
                'remoteip' => Request::ip()
            ]
    ]);

    dd($response);
}

ERR_INVALID_CHUNKED_ENCODING残念ながら、さらに調査を行わないと、クライアント ライブラリのオブジェクトをブラウザに返そうとするとなぜエラーが発生し続けるのか説明できませんが、最初の傾向としては、それはデータ タイプの問題であるということです。

あなたの質問に関する限り、あなたは実際に「リクエスト」を取り戻そうとしているのではなく、レスポンスを取り戻そうとしているのです。http://docs.guzzlephp.org/en/latest/quickstart.html#using-responsesによると、応答オブジェクトに含まれる API 応答を取得したい場合 (少なくとも私の場合はそうでした)、 'メソッドを使用したいでしょうgetBody():

public function validateRecaptcha()
{
    $client = new Client;
    $response = $client->request('POST', 'https://www.google.com/recaptcha/api/siteverify', [
            'form_params' => [
                'secret' => env('RECAPTCHA_SECRET'),
                'response' => Request::input('g-recaptcha-response'),
                'remoteip' => Request::ip()
            ]
    ]);

    return $response->getBody();
}

もちろん、それが JSON 応答 (REST) であると予想される場合は、単純に に渡してjson_decode()連想配列を取得します。

public function validateRecaptcha()
{
    $client = new Client;
    $response = $client->request('POST', 'https://www.google.com/recaptcha/api/siteverify', [
            'form_params' => [
                'secret' => env('RECAPTCHA_SECRET'),
                'response' => Request::input('g-recaptcha-response'),
                'remoteip' => Request::ip()
            ]
    ]);

    return json_decode($response->getBody(), true); // true = assoc. array
}

それが役立つことを願っています!

于 2016-07-18T07:27:13.990 に答える