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
相关产品推荐
相关产品推荐

