You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Postman调用API正常,Laravel/Guzzle调用异常问题排查

问题排查与解决方案

嘿,我一眼就瞅出问题所在啦!你遇到的这个异常,根源在于请求格式的矛盾:

  • 你在请求头里明确指定了Content-Type: application/json,说明API期望接收JSON格式的请求体;
  • 但你却用了Guzzle的form_params参数来传递数据——这个参数是用来发送表单格式(application/x-www-form-urlencoded)数据的,和你设置的Content-Type完全不匹配!

Postman能正常调用,大概率是因为你在Postman里选择了正确的JSON格式发送请求(比如用了raw模式并选择JSON),所以API能正确解析。而Guzzle这么写的话,会把数据编码成表单格式,但头里又说是JSON,API自然解析失败,抛出异常。

两种修复方案

方案1:发送JSON格式请求(推荐,匹配你设置的Content-Type)

把form_params换成json参数,Guzzle会自动帮你把数组编码成JSON字符串,同时也会自动设置正确的Content-Type(你也可以保留头里的设置,不冲突):

$res3 = $client3->post('https://app.EXAMPLE.com/api/update/'.$serial, [
    'headers' => [
        'Authorization' => 'Bearer '.$res2['token'],
        'Content-Type' => 'application/json'
    ],
    'json' => [
        'token' => $res2['token'],
        'bookingdate' => '07/07/2018 12:00 am',
        'notes' => $SpecialRequests
    ]
]);

方案2:发送表单格式请求(如果API实际接收表单数据)

如果API其实是期望接收表单数据的,那你需要去掉头里的Content-Type: application/json(或者改成application/x-www-form-urlencoded),保留form_params:

$res3 = $client3->post('https://app.EXAMPLE.com/api/update/'.$serial, [
    'headers' => [
        'Authorization' => 'Bearer '.$res2['token'],
        // 可选:手动设置表单格式的Content-Type,Guzzle也会自动帮你设置
        // 'Content-Type' => 'application/x-www-form-urlencoded'
    ],
    'form_params' => [
        'token' => $res2['token'],
        'bookingdate' => '07/07/2018 12:00 am',
        'notes' => $SpecialRequests
    ]
]);

额外建议

你可以打开Postman的请求详情,确认它发送的请求格式:

  • 看Headers标签里的Content-Type值;
  • 看Body标签里选择的是raw(JSON)还是form-data/x-www-form-urlencoded。

这样就能精准对应调整Guzzle的写法,确保和Postman的请求完全一致~

内容的提问来源于stack exchange,提问作者Aleks Per

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 12:10:47