Laravel Http门面封装Guzzle,提供简洁API与自动JSON解析;GET请求用Http::get(),失败需手动判断或调用throw();支持链式设置headers、query、timeout;POST传数组自动JSON序列化并设header;高频调用应复用client实例。

直接用 Laravel 的 Http 门面就行,它底层就是 Guzzle,但封装了更简洁的 API 和自动异常处理,不需要手动 new GuzzleClient。
如何发起 GET 请求并处理 JSON 响应
Laravel Http 默认自动解析 JSON,response()->json() 这种手动解析不用写了。注意它默认不抛异常,4xx/5xx 响应仍会返回 Illuminate\Http\Client\Response 对象,得主动判断。
- 用
throw()让 4xx/5xx 立即抛Illuminate\Http\Client\RequestException - 用
throwIf($condition)按需控制是否抛出 -
body()返回原始字符串,json()返回 PHP 数组(自动json_decode(..., true))
use Illuminate\Support\Facades\Http;
$response = Http::get('https://api.example.com/users');
if ($response->failed()) {
// 处理失败,比如记录日志
\Log::error('API failed: ' . $response->body());
}
$data = $response->json(); // 直接是数组
如何设置 Header、Query 参数和超时
Header 和 Query 都支持链式调用,比原生 Guzzle 更直观;超时单位是秒(浮点数也支持),默认无超时,生产环境务必设 timeout() 或 connect_timeout()。
-
withHeaders()接收关联数组,键名自动转为驼峰格式(如'x-api-key'→X-Api-Key) -
withQueryParameters()会自动 URL 编码值,无需手动http_build_query() -
timeout(5.5)同时作用于连接和读取,connect_timeout(2)可单独控制连接阶段
$response = Http::withHeaders([
'Authorization' => 'Bearer ' . $token,
'X-Client-ID' => config('services.api.client_id'),
])
->withQueryParameters([
'page' => 1,
'limit' => 20,
])
->timeout(10)
->get('https://api.example.com/posts');
POST 请求传 JSON 数据的正确写法
别用 body(json_encode(...)) 手动拼 —— post() 第二个参数是数组时,Laravel 自动设 Content-Type: application/json 并序列化。如果传字符串,它不会自动加 header,容易被第三方 API 拒绝。
- 传数组 → 自动 JSON 编码 + 正确 header
- 传字符串 → 不自动设 header,需显式
withBody($str, 'application/json') - 上传文件用
asMultipart(),不是attach()(那是表单字段)
$response = Http::post('https://api.example.com/webhooks', [
'event' => 'user.created',
'data' => ['id' => 123, 'email' => 'test@example.com'],
]);
如何复用连接、避免 DNS 重复解析
默认每次请求都新建 Guzzle Client,高频调用第三方 API 时可能触发 DNS 查询瓶颈或连接耗尽。用 pool() 或绑定自定义实例到容器可复用底层 GuzzleHttp\Client 实例。
- 在
AppServiceProvider::boot()中绑定命名 client:$this->app->bind('http.myapi', function () { return Http::baseUrl('https://api.example.com')->timeout(5); }); - 用
resolve('http.myapi')获取复用实例 - 不推荐全局改
Http::macro(),容易污染其他模块
真正要注意的是:Guzzle 的连接池和 DNS 缓存依赖于底层 curl 或 ext-curl 配置,PHP-FPM 下 opcache.revalidate_freq 和 DNS TTL 也会影响实际复用效果——这点文档几乎不提,但压测时很容易暴露。










