You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP中用CURL数组方式发送POST参数失败,能否修正及问题在哪?

如何用数组形式通过CURL发送JSON格式的POST请求?

问题描述

我希望通过CURL发送POST参数,尝试了数组形式的代码,但无法正常工作:

curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query(
    array(
       "content"            =>    "Hi",
       "message_type"       =>    "outgoing",
       "content_type"       =>    "input_select",
       "content_attributes" =>  '{ "items": [{ "title": "Option1", "value": "Option 1" }, { "title": "Option2", "value": "Option 2" }]}',
       "private"            =>    false
    )
));

但直接使用JSON字符串的方式却可以正常运行:

curl_setopt($ch, CURLOPT_POSTFIELDS, 
        '{
            "content": "Hi",
            "message_type" : "outgoing",
            "content_type": "input_select",
            "content_attributes": {
                "items": [
                    { "title": "Option1", "value": "Option1" },
                    { "title": "Option2", "value": "Option2" }
                ]
            },
            "private":false
        }'
    );

请问是否可以采用数组方式实现需求?如果可以,我的代码错误在哪里?

原因与解决方案

可以用数组方式实现,你的代码存在两个核心问题:

  • 请求格式不匹配
    你用http_build_query()处理数组后,发送的是application/x-www-form-urlencoded格式的表单数据,但后端接口实际需要的是application/json格式的请求体,这是数组方式失效的根本原因。

  • 嵌套结构处理错误
    你把content_attributes的值写成了JSON字符串,导致最终生成的表单数据里该字段是字符串而非嵌套的JSON对象,和接口期望的结构不符。

正确的数组实现方式

不需要用http_build_query(),而是将完整关联数组转为JSON字符串,并设置正确的请求头:

// 构造包含嵌套结构的完整关联数组
$postData = [
    "content"            => "Hi",
    "message_type"       => "outgoing",
    "content_type"       => "input_select",
    "content_attributes" => [
        "items" => [
            ["title" => "Option1", "value" => "Option1"],
            ["title" => "Option2", "value" => "Option2"]
        ]
    ],
    "private"            => false
];

// 将数组转换为标准JSON字符串
$jsonData = json_encode($postData);

// 设置CURL参数
curl_setopt($ch, CURLOPT_POSTFIELDS, $jsonData);
// 关键:添加JSON格式的请求头
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    'Content-Type: application/json',
    'Content-Length: ' . strlen($jsonData)
]);

生效原因

  • json_encode()会将完整数组转换为结构正确的JSON字符串,和你直接传入的JSON字符串结构完全一致
  • Content-Type: application/json请求头会告诉后端接口当前请求体是JSON格式,确保接口能正确解析数据

内容的提问来源于stack exchange,提问作者Trombone0904

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 05:50:25