juststeveking / laravel-transporter
Transporter 是一种未来派的方式在 PHP 中发送 API 请求。这是一种面向对象的处理 API 请求的方法。
Requires
- php: ^8.1
- illuminate/contracts: ^10.0|^11.0
- juststeveking/http-status-code: ^2.0
- juststeveking/uri-builder: ^2.0|^3.0
- spatie/laravel-package-tools: ^1.14.1
Requires (Dev)
- brianium/paratest: ^6.9|^7.4
- guzzlehttp/guzzle: ^7.5
- nunomaduro/collision: ^6.4|^8.0
- orchestra/testbench: ^8.0|^9.0
- pestphp/pest: ^1.22.4|^2.34
- phpstan/phpstan: ^1.9.17
- phpunit/phpunit: ^9.6.3|^10.5
- spatie/laravel-ray: ^1.32.2
README
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)。请参阅许可文件获取更多信息。