PHP中向第三方服务器发送带Header的PUT请求失败,求排查
问题分析与解决方案
你遇到的核心问题是你需要发送PUT请求,但当前代码配置的是POST请求,这就是请求未按预期定向到目标URL对应处理逻辑的关键原因。另外还有几个细节需要调整,让我们一步步修正:
主要问题点
- 你明确需要发送PUT请求,但代码里用了
CURLOPT_POST参数,这会强制使用POST方法,而非PUT - 缺少必要的HTTP头信息,可能导致服务器无法正确识别PUT请求的参数格式
修正后的代码
$pay_time = '01-01-2020'; $url = 'https://demo.sparktbd.com/api/response.php'; $fields = array( 'payment_status' => '0', 'payment_datetime' => $pay_time, ); $fields_string = http_build_query($fields); $ch = curl_init(); // 核心:设置PUT请求方法 curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "PUT"); // 传递PUT请求的参数 curl_setopt($ch, CURLOPT_POSTFIELDS, $fields_string); // 配置HTTP头,添加必要的格式标识 curl_setopt($ch, CURLOPT_HTTPHEADER, array( "user: sohel", "pass: Sohel@123", "Content-Type: application/x-www-form-urlencoded", "Content-Length: " . strlen($fields_string) )); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // 执行请求并捕获错误 $result = curl_exec($ch); if(curl_errno($ch)){ echo 'Curl调试错误: ' . curl_error($ch); } curl_close($ch); var_dump($fields_string); var_dump($result); // 建议添加,查看服务器返回的响应内容
关键修改说明
- 替换POST为PUT方法:移除
CURLOPT_POST, count($fields)这个POST专属配置,改用CURLOPT_CUSTOMREQUEST, "PUT"来指定PUT请求方法——CURLOPT_POST会覆盖自定义请求方法,所以必须删除。 - 添加必要的HTTP头:加上
Content-Type和Content-Length头,帮助目标服务器正确识别你发送的表单数据格式,很多后端接口依赖这些头来处理请求体。 - 增加错误调试:添加curl错误捕获代码,方便你排查后续可能出现的请求问题。
额外提醒
生产环境中不建议关闭CURLOPT_SSL_VERIFYHOST,这会带来SSL安全验证漏洞,应该配置正确的SSL证书路径来完成验证。
内容的提问来源于stack exchange,提问作者Muntashir Are Rahi
相关产品推荐
相关产品推荐

