PHP Curl发送POST请求返回空响应{},Postman可正常响应的问题求助
解决PHP Curl POST返回空对象但Postman正常的问题
我来帮你搞定这个问题!你遇到的情况非常常见——Postman能正常拿到响应,但PHP Curl返回空对象{},核心问题确实和请求的Content-Type以及参数传递方式不匹配有关。咱们一步步拆解问题,再给出修复方案。
原代码的核心问题
你的代码里存在几个矛盾点,导致服务器无法正确解析请求:
- 你把
grant_type、username、password放在了URL的查询参数里,但同时设置了Content-Type: application/json和Content-Length: 0,这相当于告诉服务器「我要发JSON格式的请求,但请求体是空的」,服务器自然无法识别URL里的参数,返回空响应。 - Postman默认发送POST表单请求时,使用的是
application/x-www-form-urlencoded的Content-Type,并且把参数放在请求体里,这才是服务器期望的格式。
修复方案一:匹配Postman的表单格式(最可能解决问题)
把参数放在POST请求体里,用表单格式传递,这是OAuth2密码模式最常用的请求方式:
<?php $url = "https://api.business.kazanexpress.ru/api/oauth/token"; // 整理请求参数 $postParams = [ 'grant_type' => 'password', 'username' => '你的实际用户名', // 替换成真实用户名 'password' => '你的实际密码' // 替换成真实密码 ]; $curl = curl_init($url); // 配置Curl选项 curl_setopt($curl, CURLOPT_URL, $url); curl_setopt($curl, CURLOPT_POST, true); curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); // 这里不需要设置Content-Type为json,curl默认会用application/x-www-form-urlencoded $headers = [ "Authorization: Basic " . base64_encode("你的client_id:你的client_secret"), // 注意这里要替换成真实的base64编码凭证 ]; curl_setopt($curl, CURLOPT_HTTPHEADER, $headers); // 将参数转换为表单格式的字符串 curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($postParams)); // 调试用的SSL选项(生产环境请删除这两行,开启SSL验证) curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false); curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); $resp = curl_exec($curl); // 新增错误排查:如果Curl执行出错,直接打印错误信息 if(curl_errno($curl)){ echo 'Curl执行错误: ' . curl_error($curl); } // 可以查看响应状态码,帮助排查授权失败等问题 // var_dump(curl_getinfo($curl, CURLINFO_HTTP_CODE)); curl_close($curl); var_dump($resp); ?>
修复方案二:如果服务器要求JSON格式请求体
如果API确实要求用JSON传递参数,那需要把参数转换成JSON字符串放在请求体里,同时去掉URL里的参数:
<?php $url = "https://api.business.kazanexpress.ru/api/oauth/token"; $postParams = [ 'grant_type' => 'password', 'username' => '你的实际用户名', 'password' => '你的实际密码' ]; // 转换为JSON字符串 $jsonParams = json_encode($postParams); $curl = curl_init($url); curl_setopt($curl, CURLOPT_URL, $url); curl_setopt($curl, CURLOPT_POST, true); curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); $headers = [ "Authorization: Basic " . base64_encode("你的client_id:你的client_secret"), "Content-Type: application/json", // 明确指定JSON格式 ]; curl_setopt($curl, CURLOPT_HTTPHEADER, $headers); curl_setopt($curl, CURLOPT_POSTFIELDS, $jsonParams); curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false); curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); $resp = curl_exec($curl); if(curl_errno($curl)){ echo 'Curl执行错误: ' . curl_error($curl); } curl_close($curl); var_dump($resp); ?>
关键注意事项
Authorization: Basic后面的内容必须是你的client_id和client_secret用冒号连接后做Base64编码的结果,比如base64_encode("my_client_id:my_client_secret"),不要直接写「token」。- 生产环境一定要删除
CURLOPT_SSL_VERIFYHOST和CURLOPT_SSL_VERIFYPEER这两个选项,开启SSL验证避免安全风险。 - 如果还是有问题,打印响应状态码(
curl_getinfo($curl, CURLINFO_HTTP_CODE)),比如401代表授权失败,400代表请求格式错误,能帮你快速定位问题。
内容的提问来源于stack exchange,提问作者Gutufik
相关产品推荐
相关产品推荐

