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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 21:57:48