使用Guzzle发送POST请求状态码200但响应体为空,Postman正常如何解决?
问题诱因
- 第一段代码存在配置冲突:
form_params是Guzzle用于发送application/x-www-form-urlencoded格式请求的专属配置,使用该配置时Guzzle会自动设置对应Content-Type头,你手动强制指定Content-Type: application/json会导致服务端收到请求后,用JSON规则解析表单格式的参数,解析失败无法返回正确结果。 - 第二段手动JSON编码传body的写法,若未同步配置正确的Content-Type头,也会导致服务端解析参数失败,同时手动编码容易出现格式错误,没有使用Guzzle原生配置可靠。
- 若你直接读取响应对象而非调用对应方法获取内容,也会出现响应体为空的错觉。
解决方法
首先确认目标接口要求的参数传递格式,对应调整Guzzle配置即可:
- 若接口要求JSON格式传参,直接使用Guzzle自带的
json配置项,无需手动编码,Guzzle会自动设置正确的请求头:
$response = $client->post('https://api.host.com/v2/tokens', [ 'debug' => true, 'json' => [ 'grant_type' => 'password', 'username' => 'my@email.com', 'password' => 'secret' ] ]);
- 若接口要求表单格式传参,使用
form_params时不要手动指定Content-Type头,避免冲突:
$response = $client->post('https://api.host.com/v2/tokens', [ 'debug' => true, 'form_params' => [ 'grant_type' => 'password', 'username' => 'my@email.com', 'password' => 'secret' ] ]);
获取响应内容时,需要调用响应对象的方法读取内容:
$responseBody = $response->getBody()->getContents();
内容的提问来源于stack exchange,提问作者penny
相关产品推荐
相关产品推荐

