piggly/php-http

一个用于处理REST API请求/响应的HTTP库。

1.0.8 2021-05-11 00:29 UTC

This package is auto-updated.

Last update: 2024-09-11 07:32:27 UTC


README

此库是为了满足Piggly团队的需求而开发的。它可能不会对您有用,但它对我们来说效果很好,扩展了我们的HTTP管理灵活性。

今天,在PHP中有很多方法来操作请求和响应。最常见的方法是遵循PSR-7接口(见此处),这使得操作HTTP协议数据变得容易。

但,没有什么是完美的。一些框架、智能自定义甚至是手工艺术家可以为处理HTTP请求和响应创建自己的模式。这使得在不强制标准的情况下打包一些数据并创建库变得困难。

例如,Laravel使用没有PSR-7实现的Illuminate\Http包。因此,当您创建需要PSR-7实现的外部全局库时,嗯...Laravel艺术家必须对每件事进行一些修复才能让它顺利工作等等。

我们知道,您可以从Laravel的Requests\Response中获得PSR-7,但然后如果您想使用原生Laravel HTTP资源和函数,您必须回到之前的状态。为什么这么复杂?这就是我们的库存在的主要原因。为了解决这个问题。通过实现智能抽象类来处理任何类型的请求和响应对象,同时仍然可以访问原始请求/响应并使用最常见的方法。

首先,这个库是针对API设计的。API附加了一些请求和响应的行为。通常,从API请求中我们可以获取正文参数、查询字符串参数和头信息。

我们还希望将响应内容数据打包成智能对象。或者,甚至将请求参数转换为智能对象,以更好地处理预期值和验证。更好,我们可以通过自动将其转换为响应来处理异常,而无需头痛。

要实现这一点,在响应中我们包含一个标准的payload,其中包含状态和信息,如下所示:

  • status_code (int):将响应代码放入API中;
  • status_message (string):对请求的补充信息;
  • status_hint (string|array):帮助解决响应问题或智能提示;

然而,响应的payload将有两种不同的行为。当响应代码等于BaseResponse::SUCCESS_CODE时,则payload将是响应。如果不等于,则将payload添加到响应的body键中。见下文

包含codeBaseResponse::SUCCESS_CODE的响应

{
	"first_name": "Caique Araujo",
	"last_name": "Araujo"
}

任何其他响应代码

{
	"status_code": 12,
	"status_message": "Cannot connect to server.",
	"status_hint": "Your credentials are invalid.",
	"body": {
		"message": "Try again after %s",
		"timestamp": 1620337766
	}
}

从现在开始,通过使用此包,我们的库更加灵活。它不在乎您是否使用纯PHP变量、PSR-7接口或甚至Illuminate\Http。只需将您使用的任何请求和响应对象打包到基本的BaseRequestBaseResponse对象中,而不会丢失原始对象即可。

下面是如何工作的。

BaseRequest对象

BaseRequest对象定义了应用程序的HTTP请求。它是一个抽象类,它使我们能够访问原始请求对象并进行一些通用实现。

  • hasHeader( string $name )方法用于检查请求中是否存在头信息;
  • header( string $name, $default = null )方法用于从请求中获取一些头信息;
  • getHeaders()方法用于获取一个包含所有头信息的数组。
  • getQueryParams() 方法用于获取所有查询字符串参数作为 数组
  • getParsedBody() 方法用于获取所有体参数作为 数组
  • getFiles() 方法用于获取所有 $_FILES 作为 数组
  • setAttribute( string $key, $default ) 方法用于设置请求属性;
  • getAttribute( string $key, $default = null ) 方法用于获取请求属性;
  • getMethod() 方法用于获取 HTTP 请求方法;

并且有一些函数

  • request() 方法用于使原始请求对象可访问;
  • payloableBody( string $class ) 方法用于将体参数转换为实现了 PayloadImportable 的对象;
  • payloableQuery( string $class ) 方法用于将查询字符串参数转换为实现了 PayloadImportable 的对象。

BaseResponse 对象

BaseResponse 对象定义了应用的 HTTP 响应。它是一个抽象类,使得我们的原始响应对象可访问,并执行一个通用实现。

  • handle() 方法用于处理当前 BaseResponse 对象到原始响应对象。

并且有一些函数

  • response() 方法用于使原始响应对象可访问;
  • request( BaseRequest $request )getRequest() 用于操作请求;
  • payload( HttpPayloadInterface $payload )getPayload() 用于操作响应有效负载数据;
  • hint( $hint )getHint() 用于操作响应提示;
  • message( $message )getMessage() 用于操作响应消息;
  • code( int $code )getCode() 用于操作响应代码;
  • httpCode( int $http_code )getHttpCode() 用于操作响应 HTTP 代码;
  • header( string $name, $value )withHeaders( array $headers )getHeaders() 用于操作响应头;
  • getContent() 用于解析响应数据为数组;

PayloadRequestPayloadResponse

它们都管理请求和响应的 有效负载。这不是必需的。然而,BaseResponse 将需要任何 PayloadInterface 来处理有效负载。

ResponseException 处理程序

创建一个可以处理为响应的异常。这将使得只需抛出一个异常给 客户端,它就可以被转换为响应对象。并且有一些函数

  • getPayload()payload() 用于管理响应有效负载。
  • getHint() 用于获取响应提示。
  • getHttpCode() 用于获取响应 HTTP 代码。
  • handle() 方法用于处理响应对象。

还有一些默认的异常模型可以抛出

变更日志

有关所有代码更改的信息,请参阅 CHANGELOG 文件。

测试代码

此库使用 PHPUnit。我们执行了此应用程序所有主要类的测试。

vendor/bin/phpunit

贡献

在提交您的贡献之前,请参阅 CONTRIBUTING 文件中的信息。

致谢

支持项目

Piggly Studio 是一家位于巴西里约热内卢的代理机构。如果您喜欢这个库并想支持这项工作,请自由地向 BTC 钱包 3DNssbspq7dURaVQH6yBoYwW3PhsNs8dnK 捐款 ❤。

许可证

MIT 许可证 (MIT)。请参阅 LICENSE