nimbly / 穿梭
简单的 PSR-18 HTTP 客户端。
1.0.1
2024-05-12 16:40 UTC
Requires
- php: ^8.0
- ext-json: *
- nimbly/capsule: ^2.0
- psr/http-client: ^1.0
Requires (Dev)
- php-coveralls/php-coveralls: ^2.1
- phpunit/phpunit: ^9.0
- symfony/var-dumper: ^4.2
- vimeo/psalm: ^4.0
Suggests
- ext-curl: Use cURL library to make HTTP calls.
Provides
README
一个简单的 PSR-18 HTTP 客户端库。
安装
composer require nimbly/shuttle
特性
- 响应创建 php://temp 响应体流,并在必要时切换到磁盘。
- 支持 cURL(默认)和流上下文处理程序。
- 开箱即用的中间件支持。
- 使用 JsonBody、FormBody 和 XmlBody 辅助类创建请求时,易于进行请求体转换。
不支持的功能
- 异步调用。
制作请求:简单的方式
开始使用 Shuttle 制作请求最快、最简单的方式是使用 HTTP 方法名称
use Nimbly\Shuttle\Shuttle; $shuttle = new Shuttle; $response = $shuttle->get("https://www.google.com"); $response = $shuttle->post("https://example.com/search", "Form data"));
Shuttle 内置方法以支持主要的 HTTP 动词:get、post、put、patch、delete、head 和 options。然而,您可以直接使用 request 方法来制作 任何 HTTP 动词请求。
$response = $shuttle->request("connect", "https://api.example.com/v1/books");
处理响应
Shuttle 中的响应实现 PSR-7 ResponseInterface,因此是可流式处理的资源。
$response = $shuttle->get("https://api.example.com/v1/books"); echo $response->getStatusCode(); // 200 echo $response->getReasonPhrase(); // OK echo $response->isSuccessful(); // true $body = $response->getBody()->getContents();
处理失败的请求
如果请求失败,Shuttle 将默认抛出 RequestException
。这包括主机名未找到、连接超时等情况。
带有 HTTP 4xx 或 5xx 状态码的响应 不会 抛出异常,必须在您的业务逻辑中正确处理。
制作请求:PSR-7 方式
如果代码的可重用性和可移植性是您的事情,通过以 PSR-7 方式制作请求来确保代码的未来性。记住,PSR-7 规定请求和响应消息应该是不可变的。
// Build Request message with your favorite PSR-7 library. $request = new Request("get", "https://www.example.com"); // Send the Request. $shuttle = new Shuttle; $response = $shuttle->sendRequest($request);
请求体
使用 \Shuttle\Body\*
辅助类轻松提交数据是请求的一种简单方式。这些类将自动转换数据,转换为 BufferStream,并在请求上设置默认的 Content-Type 标头。
支持的请求体类型包括
JsonBody
将关联数组转换为 JSON,将Content-Type
标头设置为application/json
。FormBody
将关联数组转换为查询字符串,将Content-Type
标头设置为application/x-www-form-urlencoded
。XmlBody
不转换数据,将Content-Type
标头设置为application/xml
。
提交请求的 JSON 有效负载
use Nimbly\Shuttle\Body\JsonBody; $book = [ "title" => "Breakfast Of Champions", "author" => "Kurt Vonnegut", ]; $shuttle->post("https://api.example.com/v1/books", new JsonBody($book));