PHP CURL发送RAW参数POST请求返回NULL的原因及解决方法
问题排查与解决方案
我来帮你梳理下为啥会得到NULL结果,你的代码里有几个关键错误导致REST API无法正确解析你的请求,具体问题和修复方法如下:
核心错误点
- 参数数组格式完全错误:你定义的
$param不是PHP有效的关联数组,而是把键值对写成了字符串元素(比如"account: 080000xxx"),这种写法根本没法被正确转成JSON。另外newPassword字段的语法也错了,你把.md5($pass).写在了字符串内部,这不会执行MD5加密,只会把这段文本当成密码的一部分。 - 请求格式不匹配:你设置了
Content-Type: application/json,但直接把数组传给CURLOPT_POSTFIELDS,此时CURL会默认把数组编码成application/x-www-form-urlencoded或multipart/form-data格式,和你声明的JSON格式完全冲突,API自然解析不到参数,返回NULL。
正确的RAW JSON POST请求代码
$urlsp = "https://xxx/xxx/forgotpassword/xxx"; // 注意请求头不要加多余空格,冒号后一个空格即可 $header = array( "X-Application-Token: 123er", "Content-Type: application/json" ); // 定义正确的关联数组参数 $param = array( "account" => "080000xxx", "secretQuestion" => "", "secretAnswer" => "", "newPassword" => md5($pass), // 直接调用md5函数,不要嵌套在字符串里 "issuer" => 567800 ); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $urlsp); curl_setopt($ch, CURLOPT_HTTPHEADER, $header); curl_setopt($ch, CURLOPT_POST, true); // 关键:把关联数组转成JSON字符串,这才是RAW格式的请求体 curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($param)); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // 可选:生产环境建议开启SSL验证,本地测试可暂时关闭 // curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); $json_data = curl_exec($ch); // 排查CURL自身错误(比如网络问题、SSL错误) if (curl_errno($ch)) { echo "CURL请求错误:" . curl_error($ch); } curl_close($ch); $data = json_decode($json_data); // 打印返回结果便于调试 var_dump($data);
额外排查技巧
- 用
curl_errno()和curl_error()可以快速判断是请求发送失败(比如网络不通、SSL验证失败)还是API返回了异常内容,这能帮你区分是CURL的问题还是API的问题。 - 可以先用Postman等工具模拟相同的请求,确认API本身能正常响应后,再对比Postman的请求头、请求体格式调整你的代码。
- 确保
json_encode($param)能生成有效的JSON字符串,比如如果参数里有特殊字符,可能需要设置JSON_UNESCAPED_UNICODE等选项。
内容的提问来源于stack exchange,提问作者kurama-rho
相关产品推荐
相关产品推荐

