PHP配置CURL发送POST请求调用API时提示缺少request参数
问题原因与解决方案
核心错误根源
你遇到的Missing parameter: request报错,本质是请求体格式和Content-Type要求不匹配:
- 你设置的请求头
Content-Type: application/x-www-form-urlencoded,代表服务端会按「表单键值对」规则解析请求体,也就是识别request=xxx&other=yyy这种格式的参数 - 你现在的代码是把整个数组整体转成JSON后,直接把JSON字符串作为请求体发出去,服务端根本不会把这段纯JSON文本当成表单参数解析,自然找不到名为
request的传入参数。
修正后的实现逻辑
按照API要求,request是urlencoded表单里的一个键,对应的值是序列化后的JSON字符串,正确的传参步骤是:
- 单独提取需要作为request传入的JSON结构,不要在外层多套一层包含request键的数组
- 将这个结构序列化为JSON字符串
- 构造表单格式的参数数组,将上面的JSON字符串作为
request键的值 - 让curl自动处理urlencoded格式的请求体转义
修正后的可运行代码
<?php $service_url = 'https://********/PostRequest'; $curl = curl_init($service_url); // 直接定义request对应的原始数据结构,不需要外层再套request键 $requestData = array( "Key1" => "*****", "key2" => "", "key3" => "****", "key4" => "****", "key5" => "****", "key6" => "****", "key7" => "***", "key8" => "****", "key9" => "***", "key10" => "****", "key11" => "***", "ItemList" => array( "subkey1" => "***", "subkey2" => "***", "subkey3" => "****", "subkey4" => "****", "subkey5" => "****", "subkey6" => "*****", "subkey7" => "***", "subkey8" => "***", "subkey9" => "***", "subkey10" => "**", "Subkey11" => "**", "subkey12" => "**", "subkey13" => "04", "subkey14" => "010101", "Subkey15" => "R", "Subkey16" => "70", "Subkey17" => array( "string" => "00" ) ), "Address" => array( "PrimaryAddressLine" => "", "SecondaryAddressLine" => "", "County" => "", "City" => "", "State" => "", "PostalCode" => "****", "Plus4" => "", "Country" => "", "Geocode" => "", "VerifyAddress" => "false" ) ); // 将request数据序列化为JSON字符串,加参数避免中文转义异常 $requestJson = json_encode($requestData, JSON_UNESCAPED_UNICODE); // 构造urlencoded格式的表单参数,request键对应的值就是上面的JSON字符串 $postFields = [ 'request' => $requestJson ]; // 初始化curl配置 curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); curl_setopt($curl, CURLOPT_POST, true); curl_setopt($curl, CURLOPT_HTTPHEADER, array('Content-Type: application/x-www-form-urlencoded')); // 直接传数组,curl会自动做url转义拼为符合要求的请求体 curl_setopt($curl, CURLOPT_POSTFIELDS, $postFields); $response = curl_exec($curl); // 增加错误捕获,方便定位请求问题 if(curl_errno($curl)){ echo '请求错误: ' . curl_error($curl); } curl_close($curl); print_r($response); die();
容易踩的关联坑
- 不要直接把转好的JSON字符串作为
CURLOPT_POSTFIELDS的值传出去,这种操作相当于把JSON文本直接塞到请求体里,服务端按表单规则解析时会完全找不到参数键 - 做JSON序列化时如果包含中文、特殊符号,记得加
JSON_UNESCAPED_UNICODE、JSON_UNESCAPED_SLASHES参数,避免转义后的内容和服务端预期不一致 - 可以对比Postman的实际请求体内容排查:在Postman的「发送」按钮旁边的代码生成器里,直接看PHP cURL对应的实际请求体结构,和自己写的请求体做逐字对比,就能快速定位格式差异。
内容的提问来源于stack exchange,提问作者Swapnil Shukla
相关产品推荐
相关产品推荐

