PHP使用CURL发送POST请求返回invalid_request但Postman正常如何解决
PHP CURL POST请求异常排查修复方案
核心问题点
- Content-Type拼写错误:代码中设置的
Content-Type值为application/x-www-form-urlencode,正确标准值为application/x-www-form-urlencoded,末尾缺少字母d,服务端无法正确解析请求体格式,直接返回invalid_request错误。 - POST参数格式冲突:
CURLOPT_POSTFIELDS直接传入数组时,PHP CURL会自动将请求头Content-Type覆盖为multipart/form-data,与你手动设置的x-www-form-urlencoded格式冲突,导致参数解析失败。 - 认证配置冲突:同时配置了
CURLOPT_HTTPAUTH => CURLAUTH_BASIC(CURL内置Basic认证逻辑)和手动添加Authorization请求头,两套认证逻辑冲突会导致认证信息异常。 - POST请求配置不规范:使用
CURLOPT_CUSTOMREQUEST => "POST"自定义请求方法,兼容性不如标准CURLOPT_POST => true配置,部分服务端可能识别异常。
修复后的完整代码
$url = "https://..................."; $authorization = ""; //base64 string TE1TQXBpOkxNUContinue...= $curl = curl_init(); $auth_data = array( 'scope' => 'LMSApi LMSRead', 'grant_type' => 'client_credentials' ); // 数组转urlencoded格式字符串 $post_fields = http_build_query($auth_data); $ops = array( CURLOPT_URL => $url, CURLOPT_RETURNTRANSFER => true, CURLOPT_SSL_VERIFYHOST => false, CURLOPT_SSL_VERIFYPEER => false, CURLOPT_ENCODING => "", CURLOPT_MAXREDIRS => 10, CURLOPT_TIMEOUT => 30, CURLOPT_FOLLOWLOCATION => true, CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, // 改用标准POST配置 CURLOPT_POST => true, CURLOPT_POSTFIELDS => $post_fields, // 移除内置Basic认证配置,使用手动设置的请求头 CURLOPT_HTTPHEADER => array( 'Content-Type: application/x-www-form-urlencoded', 'Authorization: Basic '.$authorization ) ); curl_setopt_array($curl, $ops); $response = curl_exec($curl); // 调试时可打开下面两行查看请求详情 // var_dump(curl_getinfo($curl)); // var_dump(curl_error($curl)); var_dump($response); curl_close($curl);
可选调试方案
如果修复后仍存在异常,可调用curl_getinfo($curl)打印请求的完整信息,包括实际发送的请求头、响应状态码、请求耗时等参数,对比Postman的请求参数逐一核对即可定位问题。
内容的提问来源于stack exchange,提问作者Noor
相关产品推荐
相关产品推荐

