POST 请求适用于 Postman,但不适用于 Guzzle

Posted

技术标签:

【中文标题】POST 请求适用于 Postman,但不适用于 Guzzle【英文标题】:POST Request works with Postman, but not with Guzzle 【发布时间】:2017-08-06 23:17:38 【问题描述】:

在我的 Laravel 应用程序中,我需要定期使用 Guzzle 将数据 POST 到 API。

API 使用不记名令牌进行身份验证,并请求和接受原始 json。为了测试,我使用 Postman 访问了 API,一切运行良好。

邮递员标题:

Accept:application/json
Authorization:Bearer [token]
Content-Type:application/json

还有邮递员的身体:


    "request1" : "123456789",
    "request2" : "2468",
    "request3" : "987654321",
    "name" : "John Doe"

Postman 返回一个 200 和一个 JSON 对象作为响应。

现在,当我尝试使用 Guzzle 进行相同操作时,我得到 200 状态代码,但没有返回任何 JSON 对象。这是我的 Guzzle 实现:

public function getClient($token)

    return new Client([
        'base_uri' => env('API_HOST'),
        'Accept' => 'application/json',
        'Authorization' => 'Bearer ' . $token,
        'Content-Type' => 'application/json'
    ]);


$post = $client->request('POST', '/path/to/api', [
    'json' => [
        'request1' => 123456789,
        'request2' => 2468,
        'request3' => 987654321,
        'name' => 'John Doe',
    ]
]);

使用 Guzzle 发布 JSON 有什么技巧吗?如果没有,有没有办法调试引擎盖下发生的事情?

我这辈子都无法理解 Postman POST 和 Guzzle POST 之间的区别。

【问题讨论】:

狂饮 6? ...您正在使用 json_decode($response->getBody()) 从响应中获取 json? 【参考方案1】:

您必须使用 headers 配置部分作为标头,而不是根级别。

return new Client([
    'base_uri' => env('API_HOST'),
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer ' . $token,
        'Content-Type' => 'application/json',
    ],
]);

【讨论】:

以上是关于POST 请求适用于 Postman,但不适用于 Guzzle的主要内容,如果未能解决你的问题,请参考以下文章

POST 请求适用于 Postman,但不适用于 axios.post()

请求适用于Postman,但不适用于axios.post

HTTP POST 请求适用于 Postman,但不适用于我的 Web 应用程序的 JavaScript 提取 [关闭]

Multipart POST 适用于 Postman,但不适用于 Angular Http Client

GET 请求适用于 Postman,但为啥它不适用于 ReactJS fetch?

Axios 发布请求适用于 Postman,但不适用于浏览器(它返回“错误 401-未授权”)