You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel中如何记录HTTP请求/响应的完整URL?

Laravel中记录含完整参数的HTTP请求URL

问题场景

用户使用Laravel的HTTP客户端发送请求,代码示例如下:

use Illuminate\Support\Facades\Http;

$url = 'http://example/';
$data = ['name' => 'quan'];
$http = Http::withHeaders([
    'x-id' => 1,
]);

$response = $http->post($url, $data);

需要记录包含完整参数的请求URL(类似http://example/?name=quan的格式),当前使用Guzzle 7.2版本,尝试$response->getEffectiveUrl()方法无效,寻求可行方案。


可行解决方案

1. 手动拼接URL与参数

如果只是需要生成带参数的URL格式用于记录,可以直接手动拼接:

use Illuminate\Support\Facades\Http;
use Illuminate\Support\Str;
use Illuminate\Support\Facades\Log;

$url = 'http://example/';
$data = ['name' => 'quan'];

// 确保URL末尾有斜杠,再拼接查询参数
$fullUrl = Str::finish($url, '/') . '?' . http_build_query($data);

$http = Http::withHeaders([
    'x-id' => 1,
]);

$response = $http->post($url, $data);

// 记录拼接后的URL
Log::info('请求URL(含参数):' . $fullUrl);

注:POST请求的参数默认在请求体中,不会拼在URL上,此方法是模拟生成带参数的URL格式用于记录。

2. 通过Guzzle TransferStats获取实际请求URL

Laravel HTTP客户端基于Guzzle,可通过transferStats获取请求的详细元数据,其中包含实际发送的完整URL:

$response = $http->post($url, $data);

// 从请求统计信息中提取完整URL
$fullUrl = $response->transferStats->getHandlerStats()['url'] ?? '无法获取URL';

// 记录URL
Log::info('实际请求URL:' . $fullUrl);

这个方法能拿到请求过程中最终的有效URL(包括重定向后的URL),如果是POST请求,URL本身不会带参数,但能得到准确的请求地址。

3. 全局记录:自定义HTTP中间件

如果需要全局监听所有HTTP请求的URL和响应,可以创建自定义中间件:

  1. 生成中间件文件:
php artisan make:middleware LogHttpRequests
  1. 编写中间件逻辑:
<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Support\Facades\Http;
use Illuminate\Support\Facades\Log;

class LogHttpRequests
{
    public function handle($request, Closure $next)
    {
        Http::macro('logRequest', function () {
            return $this->withMiddleware(function ($handler) {
                return function ($request, $options) use ($handler) {
                    // 记录请求URL
                    Log::info('HTTP请求URL:' . $request->getUri());
                    // 记录请求参数(POST参数在请求体中)
                    Log::info('请求参数:' . $request->getBody()->getContents());
                    
                    $response = $handler($request, $options);
                    
                    // 记录响应内容
                    Log::info('HTTP响应内容:' . $response->getBody()->getContents());
                    
                    return $response;
                };
            });
        });

        return $next($request);
    }
}
  1. 在app/Http/Kernel.php的$middleware数组中注册该中间件,即可全局生效所有HTTP请求的日志记录。

内容的提问来源于stack exchange,提问作者Xnova98

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 19:20:30