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

PHP cURL CURLOPT_POSTFIELDS数据在目标端始终为空的问题

WordPress插件cURL POST请求Laravel接收不到数据的解决方案

问题核心原因

你手动设置了Content-Type: multipart/form-data但未包含必要的boundary参数。当cURL的CURLOPT_POSTFIELDS传入数组时,它会自动生成带正确boundary的multipart/form-data请求头,手动覆盖这个头会导致服务端无法正确解析请求体。

修正方案

方案1:让cURL自动处理multipart/form-data请求

移除手动设置的Content-Type头,改用CURLOPT_POST标记(比CURLOPT_CUSTOMREQUEST更规范):

$ch = curl_init();
curl_setopt_array($ch, array(
    CURLOPT_URL => "my-url",
    CURLOPT_POST => true,
    CURLOPT_RETURNTRANSFER => 1,
    CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
    CURLOPT_ENCODING => '',
    CURLOPT_MAXREDIRS => 10,
    CURLOPT_TIMEOUT => 0,
    CURLOPT_FOLLOWLOCATION => true,
    CURLOPT_POSTFIELDS => array('key' => 'value', 'key2' => 'value'),
));
$response = curl_exec($ch);
// 排查cURL错误
if (curl_errno($ch)) {
    error_log('CURL请求错误: ' . curl_error($ch));
}
curl_close($ch);

方案2:使用表单编码(application/x-www-form-urlencoded)

适合简单键值对场景,用http_build_query处理数组并设置对应Content-Type:

$ch = curl_init();
$postData = http_build_query(array('key' => 'value', 'key2' => 'value'));
curl_setopt_array($ch, array(
    CURLOPT_URL => "my-url",
    CURLOPT_POST => true,
    CURLOPT_HTTPHEADER => array(
        "Content-Type: application/x-www-form-urlencoded"
    ),
    CURLOPT_RETURNTRANSFER => 1,
    CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
    CURLOPT_ENCODING => '',
    CURLOPT_MAXREDIRS => 10,
    CURLOPT_TIMEOUT => 0,
    CURLOPT_FOLLOWLOCATION => true,
    CURLOPT_POSTFIELDS => $postData,
));
$response = curl_exec($ch);
if (curl_errno($ch)) {
    error_log('CURL请求错误: ' . curl_error($ch));
}
curl_close($ch);

方案3:使用JSON格式请求

如果Laravel接口期望JSON数据,用json_encode处理数组并设置对应头:

$ch = curl_init();
$postData = json_encode(array('key' => 'value', 'key2' => 'value'));
curl_setopt_array($ch, array(
    CURLOPT_URL => "my-url",
    CURLOPT_POST => true,
    CURLOPT_HTTPHEADER => array(
        "Content-Type: application/json",
        "Accept: application/json"
    ),
    CURLOPT_RETURNTRANSFER => 1,
    CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
    CURLOPT_ENCODING => '',
    CURLOPT_MAXREDIRS => 10,
    CURLOPT_TIMEOUT => 0,
    CURLOPT_FOLLOWLOCATION => true,
    CURLOPT_POSTFIELDS => $postData,
));
$response = curl_exec($ch);
if (curl_errno($ch)) {
    error_log('CURL请求错误: ' . curl_error($ch));
}
curl_close($ch);

额外排查步骤

  • 在Laravel接口中打印原始请求体:echo file_get_contents('php://input');,确认是否有数据传入
  • 对比Postman和cURL的请求头,用curl_getinfo($ch, CURLINFO_HEADER_OUT)查看cURL发送的完整请求头,确保和Postman一致
  • 检查Laravel的请求解析逻辑:如果用JSON格式,需用$request->json()获取数据;表单编码则用$request->all()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 16:36:10