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

使用cURL发送带item[]键的多值POST请求失败:服务器接收值为Array而非多个字符串

解决PHP cURL POST数组参数(item[])的问题

我之前也碰到过一模一样的问题!当你直接把'item[]'设为数组值传给CURLOPT_POSTFIELDS时,cURL会把这个数组转换成字符串"Array"发送给服务器,这就是为什么后端只收到这个奇怪的值。原因是PHP cURL对数组参数的处理逻辑:如果数组元素是普通数组,它不会自动拆分成多个同名的表单字段,而是直接把数组转成字符串。

下面给你两种可行的解决方案,对应不同的Content-Type场景:

方案1:模拟application/x-www-form-urlencoded表单提交

这种方式和浏览器默认的表单提交行为一致(除了你的HTML表单用了multipart/form-data,但大部分后端框架两种格式都能正确解析数组):

// 构造数据数组,注意这里键名是`item`,不是`item[]`
$data = [
    'item' => ['item1', 'item2', 'item3'],
    'id' => 'someid'
];

// 用http_build_query把数组编码成URL格式的字符串
$postData = http_build_query($data);

// 设置cURL参数
curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);
// 可选:显式指定Content-Type,cURL其实会自动设置,但加上更稳妥
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/x-www-form-urlencoded']);

http_build_query会自动把item数组转换成item[]=item1&item[]=item2&item[]=item3的格式,后端就能正确识别为数组。

方案2:严格模拟multipart/form-data表单提交

如果你必须和原HTML表单的multipart/form-data格式完全一致,可以用cURL的子数组字段语法,每个item[]作为单独的字段:

// 构造包含多字段的数组,每个item[]用子数组定义
$data = [
    'id' => 'someid',
    ['name' => 'item[]', 'contents' => 'item1'],
    ['name' => 'item[]', 'contents' => 'item2'],
    ['name' => 'item[]', 'contents' => 'item3'],
];

// 直接把数组传给CURLOPT_POSTFIELDS,cURL会自动处理成multipart格式
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);

这种方式下,cURL会生成和HTML表单完全相同的multipart请求体,每个item[]字段都是独立的,后端就能正确接收3个字符串组成的数组。

两种方案都能解决你的问题,选哪种取决于后端对Content-Type的要求~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 20:17:26