跳转到主要内容

什么是 HTTP 客户端

Laravel 的 HTTP 客户端是对 Guzzle 的封装,提供了一套易用的 API。 通过 Http Facade,可以简洁地写出对外部 Web 服务或 API 的 HTTP 请求。
Guzzle 已经预装,无需额外配置即可开始使用。

基础请求

GET 请求

查询参数可以通过数组传入。

POST 请求

数据默认作为 application/json 发送。

PUT / PATCH / DELETE

处理响应

Http::get() 等方法会返回一个 Illuminate\Http\Client\Response 实例。 在该对象上有大量用于检查响应的方法。
JSON 响应也可以通过数组访问方式取值。

请求选项

设置请求头

若要声明期望接收 application/json,可以使用 acceptJson()
浏览器向 Laravel 发送 AJAX 请求时的 CSRF 头(X-CSRF-TOKEN / X-XSRF-TOKEN)可参考 CSRF 保护

认证

Bearer 令牌认证(最常见):
Basic 认证

设置基础 URL

如果对同一主机的请求较多,可以用 baseUrl() 统一设置。

发送表单数据

要以 application/x-www-form-urlencoded 发送,使用 asForm()

超时

超时会抛出 Illuminate\Http\Client\ConnectionException。 建议在调用外部 API 时始终设置超时。

重试

可以为临时性的网络故障或服务器错误设置自动重试。
条件重试(例如仅在连接错误时重试):

错误处理

手动检查错误

Laravel 的 HTTP 客户端默认不会对 4xx、5xx 响应抛出异常。 需要通过 failed()clientError() 等方法显式判断。

抛出异常

使用 throw() 时,遇到错误就会抛出 Illuminate\Http\Client\RequestException
throw() 会返回响应实例,因此可以链式调用。
若要捕获异常处理:

并发请求

如果需要同时调用多个 API,可以通过 pool() 并发执行。
比顺序执行明显更快,非常适合需要同时调用多个外部 API 的仪表盘等场景。

测试

使用 Http::fake() 模拟

测试中使用 Http::fake() 可以在不发起真实 HTTP 请求的情况下模拟响应。
针对特定 URL 设置响应:
响应序列(多次调用时按顺序返回):

校验请求

Http::assertSent() 可以校验发出的请求内容。
测试中一定要在最开始调用 Http::fake()。 忘记调用可能会真的对外部 API 发起请求。 使用 Http::preventStrayRequests() 可以让未被 fake 的 URL 请求抛出异常。

阻止“漏网”请求

实战示例:调用外部 API 的服务类

在真实项目中,把 HTTP 客户端逻辑封装到服务类中是最佳实践。
1

创建服务类

2

在服务提供者中注册

3

在控制器中使用

4

编写测试

小结

  • 将 HTTP 客户端逻辑封装到服务类中
  • 始终设置超时(timeout()connectTimeout()
  • 对临时故障设置自动重试(retry()
  • 测试中一定使用 Http::fake(),不要真的访问外部 API
  • 在测试的 setUp 中加入 Http::preventStrayRequests() 更保险
  • API 令牌和凭证通过环境变量和 config/services.php 管理
最后修改于 2026年7月18日