nimbly/穿梭

简单的 PSR-18 HTTP 客户端。

1.0.1 2024-05-12 16:40 UTC

This package is auto-updated.

Last update: 2024-09-12 18:01:51 UTC


README

Latest Stable Version GitHub Workflow Status Codecov branch License

一个简单的 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));