PHP发送cURL请求返回Bad Request错误的排查求助
问题排查结果
你的代码存在3处直接导致400 Bad Request的错误:
- payload结构错误:调用
json_encode时额外给$data包了一层数组,最终发送的是JSON数组格式,而接口要求接收顶层为JSON对象的请求体,结构完全不匹配。 - 请求头配置错误:手动硬编码了
Content-Length: 65,实际生成的请求体长度和该值不符,cURL会自动计算请求体长度,无需手动设置该头,硬编码错误值会直接被服务端拦截。 - 未显式声明POST请求:仅设置
CURLOPT_POSTFIELDS在部分cURL版本下不会自动切换为POST请求,需显式指定请求方法。
修正后可运行代码
function scustom_curl($url){ $ch = curl_init(); $data = [ "keys" => [ "txv" => [44], "ats" => [5] ], "skipCount" => 0, "maxResultCount" => 12 ]; // 直接编码$data,不再额外包裹数组 $payload = json_encode($data); curl_setopt($ch, CURLOPT_URL, $url); // 显式指定POST请求 curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, $payload); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); curl_setopt($ch, CURLOPT_ENCODING, 'gzip, deflate'); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 1); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10); curl_setopt($ch, CURLOPT_TIMEOUT, 10); $headers = [ 'Host: www.ilan.gov.tr', // 测试时如果cookie过期可以先注释掉该行,或替换为最新的有效cookie 'Cookie: _ga=GA1.3.951992202.1654450742; _gid=GA1.3.480689736.1654596075', 'Sec-Ch-Ua: "-Not.A/Brand";v="8", "Chromium";v="102"', 'Pragma: no-cache', 'X-Request-Origin: IGT-UI', 'Sec-Ch-Ua-Mobile: ?0', 'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.5005.63 Safari/537.36', 'Content-Type: application/json-patch+json', 'Accept: text/plain', 'Expires: Sat, 01 Jan 2000 00:00:00 GMT', 'Cache-Control: no-cache', 'X-Requested-With: XMLHttpRequest' // 已删除硬编码的Content-Length头,由cURL自动计算 ]; curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); $result = curl_exec($ch); if (curl_errno($ch)) { echo 'Error:' . curl_error($ch); } curl_close($ch); return $result; }
补充说明
如果运行后仍返回错误,优先检查Cookie是否过期,该站点的部分接口会校验请求携带的Cookie有效性,你可以替换为自己抓包拿到的最新Cookie再测试。如果本地环境存在SSL证书校验问题,可临时将CURLOPT_SSL_VERIFYPEER设为false调试,生产环境建议保持开启。
内容的提问来源于stack exchange,提问作者Fatih AKAN
相关产品推荐
相关产品推荐

