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

标签 php laravel http laravel-5 guzzle6

我在 laravel 5 中使用 guzzle 6 发送 post 请求,但是当我尝试在处理 post 请求的方法中访问 request() 时,我收到 ERR_INVALID_CHUNKED_ENCODING 。

这是我的代码:

路由.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 的文档和网络上的一些内容之后,我可以找到如何在请求中适本地获取和传递内容长度。任何帮助将不胜感激!

最佳答案

首先,这里有一些测试代码,您应该能够根据您的目的进行调整(另请参阅 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 不断出现,但我最初的倾向是它是一个数据类型问题。

就您的问题而言,您实际上并不是在尝试返回“请求”,而是响应。根据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
}

希望有帮助!

关于php - 返回 GuzzleHttp 响应对象会导致浏览器中出现 ERR_INVALID_CHUNKED_ENCODING,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36957242/

相关文章:

android - 使用 Phonegap 扫描名片

laravel - Eloquent 做了很多查询

php - Laravel 家园 : "VM not created.. moving on"

php - 拉拉维尔 5.7。减去模型实例

php - 在 PHP 中管理 MySQL SET 数据类型

.NET WCF 无法解码 "Chunked"响应

javascript - Node Express 使用 JSON 作为 API 响应发送图像文件

php - 是否有相当于 strtotime 的 R

php - 当数据库发生变化时自动更改 html 项目

javascript - 将 Javascript 数组转换为 PHP 数组