laravel 9 中推荐使用 http facade 而非原生 curl 发送 raw body 请求;若必须用 curl,需传字符串化 payload、显式设 content-type、禁用自动编码。

在 Laravel 9 中,不推荐直接用原生 cURL 发送带 Raw Body 的请求,因为框架已封装更安全、易维护的 HTTP 客户端(Http facade 或 GuzzleHttp\Client)。但如果你确实需要底层控制(如调试、特殊 header、流式 body),可以用原生 cURL —— 关键是正确设置 CURLOPT_POSTFIELDS 和禁用自动编码。
✅ 正确设置 Raw Body(非表单格式)
发送 JSON、XML、纯文本等原始数据时,必须:
- 用
json_encode($data)或字符串拼接生成原始字节流(不要传数组) - 显式设置
Content-Typeheader(如application/json) - 禁用 cURL 自动将数组转为
application/x-www-form-urlencoded:确保CURLOPT_POSTFIELDS是字符串,不是数组
? 原生 cURL 示例(发送 JSON Raw Body)
以下代码可在控制器或服务中直接使用:
父母的功课——育儿心理学对话支持技能(心虫增强版)。提供结构化对话、情绪识别、场景匹配与安全检测;可选Python脚本(scripts/)在SKILL_DIR/data/本地存储评估历史、洞察与会话状态,不对外传输。核心路径:觉察(看见防御)→接纳(慈悲是……
$url = 'https://api.example.com/webhook';
$data = ['name' => 'Laravel', 'version' => 9];
$payload = json_encode($data); // ✅ 必须是字符串
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $payload); // ❌ 切勿传 $data 数组
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Content-Type: application/json',
'Content-Length: ' . strlen($payload),
]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_TIMEOUT, 10);
$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($response === false) {
throw new \Exception('cURL error: ' . curl_error($ch));
}
? 更推荐:用 Laravel Http Facade(简洁安全)
绝大多数场景建议用 Laravel 内置客户端,它自动处理 JSON 编码、header、错误等:
- 发送 JSON:自动设
Content-Type并序列化 - 发送原始字符串:用
body()方法 - 支持 Promise、重试、日志等扩展能力
示例:
// 自动 JSON 编码(最常用)
$response = Http::post('https://api.example.com/webhook', [
'name' => 'Laravel',
'version' => 9
]);
// 手动控制 Raw Body(如发送 XML 或自定义 JSON 字符串)
$jsonStr = '{"name":"Laravel","version":9}';
$response = Http::withHeaders([
'Content-Type' => 'application/json'
])->body($jsonStr)->post('https://api.example.com/webhook');
⚠️ 注意事项
常见坑点提醒:
-
CURLOPT_POSTFIELDS传数组 → 触发application/x-www-form-urlencoded,body 被改写 - 忘记设
Content-Length→ 某些服务(如 Nginx + proxy)可能截断请求 - 中文或特殊字符未 UTF-8 编码 →
json_encode()要加JSON_UNESCAPED_UNICODE - Laravel 默认开启 HTTPS 验证 → 测试时若用自签名证书,需加
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false)(仅开发环境)










