在 laravel 9 中,推荐使用内置 http 门面发送 text/plain 请求,通过 withbody('content', 'text/plain') 设置内容类型,避免原生 curl;它更安全、可测试、支持自动日志、重试与异常处理。

在 Laravel 9 中,**不推荐直接使用原生 cURL 发送 `text/plain` 请求**,而是应统一使用框架内置的 `Http` 门面(基于 Guzzle 封装),它更安全、可测试、易维护,且天然支持 `text/plain` 内容类型。
用 Http 门面发送 text/plain 请求
核心是设置请求头 `Content-Type: text/plain`,并以字符串形式传入原始文本体:
- 确保你已启用 `Illuminate\Support\Facades\Http` 门面(默认已注册)
- 调用 `Http::withBody($content, 'text/plain')`,而非 `post()` 的数组参数(后者会自动设为 `application/json` 或 `application/x-www-form-urlencoded`)
- 避免手动拼接 URL 查询参数;如需 GET 查询,用第二个参数传数组,框架自动编码
示例代码:
利用农业相机拍摄植物叶片高分辨率图像,通过AI视觉技术检测叶片卷曲方向(向上卷曲或向下卷曲)
use Illuminate\Support\Facades\Http;
$response = Http::withHeaders([
'Accept' => 'text/plain',
])->withBody('Hello from Laravel 9', 'text/plain')
->timeout(10)
->post('https://api.example.com/echo');
if ($response->successful()) {
echo $response->body(); // 服务端返回的纯文本
}
为什么不用原生 curl_exec?
原生 cURL 在 Laravel 9 中属于“绕过框架”的操作,会丢失关键能力:
- 无法自动集成日志、异常拦截、重试中间件等 Laravel HTTP 客户端生态功能
- 手动处理超时、SSL 验证、重定向、错误码判断易出错(如忽略 `CURLOPT_FAILONERROR` 导致 4xx/5xx 被当成成功)
- 难以与 Laravel 的测试工具(如 `Http::fake()`)配合,导致单元测试失效
若必须用原生 cURL(极少数场景)
仅限调试或特殊扩展需求,务必手动配置关键选项:
- 设置 `CURLOPT_HTTPHEADER` 包含 `'Content-Type: text/plain'` 和 `'Accept: text/plain'`
- 启用 `CURLOPT_RETURNTRANSFER` 确保返回字符串而非直接输出
- 显式设置 `CURLOPT_TIMEOUT` 和 `CURLOPT_SSL_VERIFYPEER`(生产环境禁用 `false`)
- 检查 `curl_error()` 和 `$http_code`,不能只靠 `curl_exec()` 返回值判断成败
Laravel 9 的设计哲学是:让常规 HTTP 交互变简单,把复杂性留给真正需要定制的地方。发 `text/plain` 就是常规操作,用 `Http::withBody()` 即可干净解决。










