返回GuzzleHttp响应对象会导致浏览器中出现ERR_INVALID_CHUNKED_ENCODING

时间:2016-04-30 16:15:55

标签: php laravel http laravel-5 guzzle6

我在laravel 5中使用guzzle 6发送帖子请求,但是当我尝试在处理post请求的方法中访问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());
}

我到了post请求处理程序,因为我已经尝试过diedump一个字符串并且它到达那里,但是如果我调用request()我得到了那个错误。对于我所研究的内容它可能与内容长度有关,但在阅读guzzle的文档和网络上的一些内容后,我可以找到如何在请求中适当地获取和传递内容长度。任何帮助将非常感谢!

1 个答案:

答案 0 :(得分:2)

首先,这里有一些测试代码,您应该能够根据自己的需要进行调整(另请参阅GuzzleHttp文档中的form_params):

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不断出现,但我最初的倾向是它是一个数据类型问题。

就你的问题而言,你实际上并没有试图找回&#34;请求&#34;而是响应。根据{{​​3}},如果您想获得响应对象中包含的API响应(或者至少在我的情况下,我做过),您将要使用getBody()方法:< / p>

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
}

希望有所帮助!