laravel 5 通过 guzzle 或 ixudra/curl 间接使用 curl,需显式设置 content-type 和 accept 头的 charset=utf-8,并用 json_unescaped_unicode 保持中文可读性;响应非 utf-8 时需手动转码。

Laravel 5 并不直接“启动 cURL”,而是通过底层 HTTP 客户端(如 Guzzle)或第三方扩展(如 ixudra/curl)间接使用 cURL。你真正要做的,是在发起 HTTP 请求时正确设置请求头和编码参数,确保数据以预期格式(如 UTF-8)发送与接收。
以下是针对 Laravel 5 的几种常见场景及对应设置方式:
使用原生 PHP cURL(手动配置)
如果你在控制器或服务中手写 curl_init(),需显式设置字符编码相关选项:
- 设置请求体为 UTF-8:确保
json_encode()或http_build_query()的输入是 UTF-8 字符串(PHP 文件本身应保存为 UTF-8 无 BOM); - 告知服务器内容编码:
curl_setopt($ch, CURLOPT_HTTPHEADER, [ 'Content-Type: application/json; charset=utf-8', 'Accept: application/json; charset=utf-8', ]); - 若发送表单数据,也建议加
charset=utf-8:'Content-Type: application/x-www-form-urlencoded; charset=utf-8'
使用 ixudra/curl 扩展(Laravel 5 常用)
该扩展封装了 cURL,支持链式调用:
-
发送 JSON 并指定 UTF-8:
accurLex专业合同审查下载基于5000余部现行法律法规进行的高质量专业合同审查,一键输出审查意见书,并附有参考法条原文,满足专业溯源核查要求。由accurLex知法提供技术支持。 Use when users ask for 合同审查, 审查意见书, 合同风险分析, 条款审查,知法,accurLex or 站在甲方/乙方角度审查合同 through accurLex direct API. China law only, plaintext only, review mode limited to 审查意见书.
use Ixudra\Curl\Facades\Curl; $response = Curl::to('https://api.example.com/data') ->withData(['name' => '张三']) ->withHeader('Content-Type', 'application/json; charset=utf-8') ->asJson() ->post(); 注意:
->asJson()默认已设Content-Type: application/json,但不带charset;如需显式声明,用->withHeader()补充。
使用 Guzzle(Laravel 5.5+ 更推荐,但 5.x 可手动引入)
若项目已集成 Guzzle(如通过 guzzlehttp/guzzle),可这样控制编码:
- 确保请求体字符串是 UTF-8(PHP 默认支持),并设置头:
$client = new \GuzzleHttp\Client(); $response = $client->post('https://api.example.com/data', [ 'headers' => [ 'Content-Type' => 'application/json; charset=utf-8', 'Accept' => 'application/json; charset=utf-8', ], 'body' => json_encode(['name' => '张三'], JSON_UNESCAPED_UNICODE), ]); - 关键点:
JSON_UNESCAPED_UNICODE防止中文被转成\uXXXX,保持可读性与兼容性。
响应端接收时的编码处理
Laravel 默认以 UTF-8 解析响应体,但若 API 返回非 UTF-8 编码(如 GBK),需手动转换:
$body = $response->getBody()->getContents();
if (mb_detect_encoding($body, ['GBK', 'UTF-8']) === 'GBK') {
$body = mb_convert_encoding($body, 'UTF-8', 'GBK');
}
不复杂但容易忽略










