jenky/transmit

Laravel HTTP 客户端管理器

1.1.0 2022-03-03 05:01 UTC

This package is auto-updated.

Last update: 2024-09-20 13:05:52 UTC


README

Latest Version on Packagist Test Status Codecov Total Downloads Software License

此包允许您快速创建具有预定义配置的 HTTP 客户端。

安装

您可以使用 Composer 将 Transmit 安装到您的 Laravel 项目中

$ composer require jenky/transmit

安装 Transmit 后,使用 vendor:publish Artisan 命令发布其资产。

php artisan vendor:publish

php artisan vendor:publish --provider="Jenky\Transmit\TransmitServiceProvider"

配置

发布 Transmit 的资产后,其主配置文件将位于 config/transmit.php。此配置文件允许您配置您的 Guzzle 客户端选项,每个配置选项都包括其目的的描述,因此请确保彻底探索此文件。

客户端配置

客户端只是一个具有自己配置的 HTTP 客户端实例。这允许您随时随地在需要的地方创建 HTTP 客户端并重复使用。

配置选项

在通道中设置 Guzzle 请求选项。有关更多信息,请访问 请求选项

'clients' => [
    'github' => [
        'options' => [
            'base_uri' => 'https://api.github.com/v3/',
            'time_out' => 20,
        ],
    ],
]

然后在您的代码中使用它

use Illuminate\Support\Facades\Http;

Http::client('github')->get('....');

自定义客户端挂起请求

要开始,在通道的配置中定义一个 tap 数组。该 tap 数组应包含一个类列表,这些类应有机会在创建后自定义(或“获取”挂起的请求实例)

'default' => [
    'tap' => [
        App\Http\Client\CustomizeRequest::class,
    ],
],

一旦您已为您客户端配置了 tap 选项,您就可以定义将自定义客户端工厂实例的类。此类只需要一个方法:__invoke,它接收一个 Illuminate\Http\Client\PendingRequest 实例。

<?php

namespace App\Http\Client;

use Illuminate\Http\Client\PendingRequest;

class CustomizeRequest
{
    /**
     * Customize the given client pending request instance.
     *
     * @param  \Illuminate\Http\Client\PendingRequest  $request
     * @return void
     */
    public function __invoke(PendingRequest $request)
    {
        $request->withToken('my_access_token');
    }
}

所有“tap”类都由服务容器解析,因此它们所需的任何构造函数依赖项将自动注入。

"Tap" 类参数

"Tap" 类还可以接收额外的参数。例如,如果您的处理程序需要使用特定的 Laravel 日志记录通道记录 Guzzle 请求和响应,则可以创建一个接收通道名称作为额外参数的 UseLogger 类。

额外参数将在 $request 参数之后传递给类

<?php

namespace App\Http\Client;

use GuzzleHttp\MessageFormatter;
use GuzzleHttp\Middleware;
use Illuminate\Http\Client\PendingRequest;
use Illuminate\Log\LogManager;

class UseLogger
{
    /**
     * The logger manager instance.
     *
     * @var \Illuminate\Log\LogManager
     */
    protected $logger;

    /**
     * Create new log middleware instance.
     *
     * @param  \Illuminate\Log\LogManager $logger
     * @return void
     */
    public function __construct(LogManager $logger)
    {
        $this->logger = $logger;
    }

    /**
     * Customize the given client pending request instance.
     *
     * @param  \Illuminate\Http\Client\PendingRequest  $request
     * @param  string|null  $channel
     * @param  string  $level
     * @return void
     */
    public function __invoke(PendingRequest $request, ?string $channel = null, string $level = 'debug')
    {
        $request->withMiddleware(Middleware::log(
            $this->logger->channel($channel), new MessageFormatter, $level
        ));
    }
}

"Tap" 类参数可以在 transmit 配置中指定,通过在类名和参数之间使用 : 分隔。多个参数应由逗号分隔

'my_client' => [
    'tap' => [
        App\Http\Client\UseLogger::class.':slack,info',
    ],
],

如果您不想使用基于类的方法定义,也可以使用 closure

'my_client' => [
    'tap' => [
        function (PendingRequest $request) {
            $request->asForm();
        },
    ],
],

注意事项

检查模拟请求

如果请求是从特定客户端发出的,则应从 HTTP 客户端实例而不是 Http 门面调用所有 assert* 方法。

use Illuminate\Http\Client\Request;
use Illuminate\Support\Facades\Http;

Http::fake();

Http::client('my_client')->get('foo');

Http::client('my_client')->assertSent(function (Request $request) {
    //
});

Http::client('my_client')->assertNotSent(function (Request $request) {
    //
});

更改日志

请参阅 CHANGELOG 了解最近的变化。

测试

$ composer test

贡献

有关详细信息,请参阅 CONTRIBUTINGCODE_OF_CONDUCT

安全性

如果您发现任何与安全相关的问题,请通过电子邮件 contact@lynh.me 联系我们,而不是使用问题跟踪器。

致谢

许可

MIT 许可证 (MIT)。有关更多信息,请参阅 许可文件