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
相关产品推荐
相关产品推荐

