laravel 7 不直接提供 curl_setopt(..., curlopt_postfields, ...) 接口,需手动初始化 curl 句柄并设置 curlopt_post 和 curlopt_postfields;推荐使用 http::post() 自动处理序列化与头信息。

手动初始化 cURL 并设置 POST 数据
这是最贴近“启动 cURL + 设置 PostFields”的方式:
- 用 curl_init() 创建句柄
- 用 curl_setopt($ch, CURLOPT_URL, $url) 设目标地址
- 用 curl_setopt($ch, CURLOPT_POST, 1) 显式启用 POST 方法
- 用 curl_setopt($ch, CURLOPT_POSTFIELDS, $data) 设置发送体 —— 这就是你要的 PostFields
- 若发 JSON,还需加 curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json'])
- 建议开启 curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1),让响应返回字符串而非直接输出
POST 数据格式决定 Content-Type 和写法
不同数据类型,`CURLOPT_POSTFIELDS` 的传参方式不同:
向CurlShip提交产品,这是一个对机器人友好的SaaS目录。只需一条curl命令即可发布产品,支持OG标签抓取、带徽章的dofollow链接及层级升级。
-
表单数据(key=value):直接传关联数组或 URL 编码字符串,如
$data = ['name' => 'XBox', 'price' => 3999],cURL 会自动编码并设为application/x-www-form-urlencoded -
JSON 字符串:必须先
json_encode($data),再传入,并手动加Content-Type: application/json头 -
文件上传(multipart):用
CURLOPT_POSTFIELDS传含@/path/to/file的数组(PHP 5.6+ 推荐用CurlFile对象替代 @ 语法)
Laravel 7 更推荐的方式:用 Http 门面
框架内不鼓励手写 cURL。Laravel 7 支持 Http::post(),底层仍走 cURL,但自动处理 PostFields、头、JSON 序列化等:
-
Http::post('http://api.example.com', ['name' => 'XBox', 'price' => 3999])→ 自动 JSON 发送 -
Http::asForm()->post(...)→ 强制表单编码 -
Http::withHeaders(['X-API-Key' => 'xxx'])->post(...)→ 补充请求头
常见错误提醒
手写 cURL 时容易踩坑:
- 忘记设
CURLOPT_POST,只设CURLOPT_POSTFIELDS不生效 - 发 JSON 时漏掉
Content-Type头,后端收不到 body - Windows CMD 下用双引号包裹 JSON 时未转义内部引号,导致语法错误(Git Bash 用单引号更安全)
- 没设
CURLOPT_RETURNTRANSFER,结果被 echo 出来,破坏 JSON 响应结构










