首先创建自定义Guzzle中间件,在app/Http/Middleware下新建GlobalHttpClientMiddleware.php文件,通过中间件拦截请求与响应,实现为所有HTTP客户端请求自动添加请求头、日志记录等全局行为。

在 Laravel 中,如果你想为所有通过 HTTP 客户端(Illuminate\Support\Facades\Http)发起的请求添加全局行为(比如自动添加请求头、日志记录、错误处理等),可以通过自定义 Guzzle 中间件并绑定到 Laravel 的 HTTP 客户端上实现。
1. 创建自定义 Guzzle 中间件
Laravel 的 HTTP 客户端底层使用的是 Guzzle,因此你可以创建一个 Guzzle 的中间件来拦截请求和响应。
在 app/Http/Middleware 目录下新建文件 GlobalHttpClientMiddleware.php:
withHeader('X-Client', 'Laravel-Global');
return $next($request);
}
}
但注意:上面这种写法是针对传入请求的中间件,不适用于 HTTP 客户端(发出请求)。
正确的做法是创建一个 Guzzle HandlerStack 中间件:
// app/Services/Http/GlobalRequestMiddleware.php
namespace App\Services\Http;
use Psr\Http\Message\RequestInterface;
class GlobalRequestMiddleware
{
public function handle()
{
return function (callable $handler) {
return function (RequestInterface $request, array $options) use ($handler) {
// 修改请求:例如添加全局 Header
$request = $request->withHeader('User-Agent', 'MyApp/1.0');
$request = $request->withHeader('X-Timestamp', now()->toISOString());
// 可以在这里记录日志
\Log::info('Outgoing request: ' . $request->getMethod() . ' ' . $request->getUri());
// 继续处理请求
return $handler($request, $options);
};
};
}
}
2. 在服务提供者中注册全局中间件
创建一个服务提供者来配置 HTTP 客户端的默认行为:
php artisan make:provider HttpClientServiceProvider
编辑 app/Providers/HttpClientServiceProvider.php:
withMiddleware($middleware->handle());
});
// 设置默认行为(可选:对所有请求生效)
Http::withMiddleware($middleware->handle());
}
}
然后在 config/app.php 中注册该服务提供者:
'providers' => [
// 其他服务提供者...
App\Providers\HttpClientServiceProvider::class,
],
3. 使用方式
现在你应用中所有使用 Http:: 发起的请求都会经过你的全局中间件:
$response = Http::get('https://api.example.com/data');
它会自动带上你定义的 Header 和日志记录。
4. 可扩展功能
- 认证 Token:从配置或数据库读取 token 并自动附加到请求头
- 请求日志:记录每次请求的 URL、耗时、状态码
- 异常重试:结合中间件做网络重试逻辑
- 环境判断:只在生产环境添加某些头信息
总结
Laravel 没有直接的“HTTP 客户端中间件”概念,但你可以通过 Guzzle 的 Middleware + HandlerStack 实现全局拦截。核心思路是:
- 编写一个返回
Closure的中间件类 - 使用
Http::withMiddleware()注册它 - 在服务提供者中全局应用,确保启动时加载
基本上就这些,不复杂但容易忽略细节,特别是闭包结构和调用时机。










