juststeveking/laravel-transporter

Transporter 是一种未来派的方式在 PHP 中发送 API 请求。这是一种面向对象的处理 API 请求的方法。

3.0.0 2024-04-22 08:47 UTC

This package is auto-updated.

Last update: 2024-09-09 14:46:01 UTC


README

Latest Version on Packagist GitHub Tests Action Status Total Downloads

Transporter 是一种未来派的方式在 PHP 中发送 API 请求。这是一种面向对象的处理 API 请求的方法。

安装

您可以通过 composer 安装此包

composer require juststeveking/laravel-transporter

您可以使用以下命令发布配置文件

php artisan vendor:publish --provider="JustSteveKing\Transporter\TransporterServiceProvider" --tag="transporter-config"

已发布的配置文件内容

return [
    'base_uri' => env('TRANSPORTER_BASE_URI'),
];

生成请求

要生成与 Transporter 一起使用的 API 请求,您可以使用 Artisan make 命令

php artisan make:api-request NameOfYourRequest

默认情况下,将发布为:app/Transporter/Requests/NameOfYourRequest.php

使用方法

Transporter 请求是 Laravel 的 PendingRequest 的扩展,因此您可以在请求中使用所有可用的方法。

此外,当您发送请求时,您将收到一个 Illuminate\Http\Client\Response,这使得您可以轻松地进行诸如 collect($key)json()failed() 等操作。我们只是将发送方式转变为基于类的方法。

TestRequest::build()
    ->withToken('foobar')
    ->withData([
        'title' => 'Build a package'
    ])
    ->send()
    ->json();

在构建要发送的请求时,您可以覆盖以下内容

  • 使用 withData(array $data) 使用请求数据
  • 使用 withQuery(array $query) 使用请求查询参数
  • 使用 setPath(string $path) 使用请求路径

检查有效载荷

我在一个问题中收到了一个请求,希望能够看到请求的数据,因此我添加了一个名为 payload 的辅助方法,它将返回存储在请求 data 属性中的任何内容。

$request = TestRequest::build()
    ->withToken('foobar')
    ->withData([
        'title' => 'Build a package'
    ]);

$data = $request->payload(); // ['title' => 'Build a package']

并发请求

$responses = \JustSteveKing\Transporter\Facades\Concurrently::build()->setRequests([
    TestRequest::build()
        ->withToken('foobar')
        ->withData([
        'title' => 'Build a package'
    ]),
    TestRequest::build()
        ->withToken('foobar')
        ->withData([
        'title' => 'Build a package'
    ]),
    TestRequest::build()
        ->withToken('foobar')
        ->withData([
        'title' => 'Build a package'
    ]),
]);

$responses[0]->json();
$responses[1]->json();
$responses[2]->json();

使用自定义键的并发

$responses = \JustSteveKing\Transporter\Facades\Concurrently::build()->setRequests([
    TestRequest::build()
        ->as(
            key: 'first'
        )
        ->withToken('foobar')
        ->withData([
        'title' => 'Build a package'
    ]),
    TestRequest::build()
        ->as(
            key: 'second'
        )
        ->withToken('foobar')
        ->withData([
        'title' => 'Build a package'
    ]),
    TestRequest::build()
        ->as(
            key: 'third'
        )
        ->withToken('foobar')
        ->withData([
        'title' => 'Build a package'
    ]),
]);

$responses['first']->json();
$responses['second']->json();
$responses['third']->json();

可选别名

除了标准的 send() 方法外,还可以使用有趣的别名 energize()请注意,不包括声音效果。

TestRequest::build()
    ->withToken('foobar')
    ->withData([
        'title' => 'Build a package'
    ])
    ->energize()
    ->json();

模拟请求或并发

要模拟请求,只需将构建方法替换为模拟方法,该方法接受一个可选的 status 参数,以设置响应中返回的状态码

TestRequest::fake(
    status: 200,
)->withToken('foobar')
->withData([
    'title' => 'Build a package'
])->withFakeData([
    'data' => 'faked'
])->send();
$responses = Concurrently::fake()->setRequests([
    TestRequest::fake()->setPath(
        path: '/todos/1',
    )->as(
        key: 'first'
    ),
    TestRequest::fake()->setPath(
        path: '/todos/2',
    )->as(
        key: 'second'
    ),
    TestRequest::fake()->setPath(
        path: '/todos/3',
    )->as(
        key: 'thirds'
    ),
])->run();

这将返回一个包含您通过 withFakeData 传递的数据的响应,内部将合并类上已有的内容与您传递的内容。因此,您可以针对每个类构建模拟数据的初始状态。

发送 XML

感谢 @jessarcher 提出的出色建议,我们可以使用 Trait 允许在请求中轻松使用 XML。将此作为 trait 是非常有意义的,因为大多数 API 这些天都使用 JSON,所以这完全是可选的。要使用此功能,只需在请求上使用 trait 即可

<?php

declare(strict_types=1);

namespace App\Transporter\Requests;

use JustSteveKing\Transporter\Concerns\SendsXml;
use JustSteveKing\Transporter\Request;

class XmlRequest extends Request
{
    use SendsXml;
    
    protected string $method = 'POST';
    
    protected string $path = '/your-endpoint';
}

然后,您只需要调用方法

XmlRequest::build()->withXml(
    xml: '<todo><name>Send an XML Requets</name><completed>false</completed></todo>'
)->send();

测试

并行运行测试

composer run test

带有覆盖率报告运行测试

composer run test-coverage

更改日志

请参阅 CHANGELOG 了解最近更改的更多信息。

贡献

有关详细信息,请参阅 CONTRIBUTING

安全漏洞

有关如何报告安全漏洞的详细信息,请参阅 我们的安全策略

鸣谢

许可协议

MIT许可协议(MIT)。请参阅许可文件获取更多信息。