You need to enable JavaScript to run this app. PHP配置CURL发送POST请求调用API时提示缺少request参数
优惠活动
大模型
产品
解决方案
定价
更多

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字符串,正确的传参步骤是:

  1. 单独提取需要作为request传入的JSON结构,不要在外层多套一层包含request键的数组
  2. 将这个结构序列化为JSON字符串
  3. 构造表单格式的参数数组,将上面的JSON字符串作为request键的值
  4. 让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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.31 04:27:03