piggly / php-http
一个用于处理REST API请求/响应的HTTP库。
Requires
- php: ^7.2 || ^8.0
- piggly/php-payload: ^1.0.4
Requires (Dev)
- illuminate/http: ^8.40
- phpunit/phpunit: ^9.5
- roave/security-advisories: dev-latest
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键中。见下文
包含code为BaseResponse::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。只需将您使用的任何请求和响应对象打包到基本的BaseRequest和BaseResponse对象中,而不会丢失原始对象即可。
下面是如何工作的。
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()用于解析响应数据为数组;
PayloadRequest 和 PayloadResponse
它们都管理请求和响应的 有效负载。这不是必需的。然而,BaseResponse 将需要任何 PayloadInterface 来处理有效负载。
ResponseException 处理程序
创建一个可以处理为响应的异常。这将使得只需抛出一个异常给 客户端,它就可以被转换为响应对象。并且有一些函数
getPayload()和payload()用于管理响应有效负载。getHint()用于获取响应提示。getHttpCode()用于获取响应 HTTP 代码。handle()方法用于处理响应对象。
还有一些默认的异常模型可以抛出
变更日志
有关所有代码更改的信息,请参阅 CHANGELOG 文件。
测试代码
此库使用 PHPUnit。我们执行了此应用程序所有主要类的测试。
vendor/bin/phpunit
贡献
在提交您的贡献之前,请参阅 CONTRIBUTING 文件中的信息。
致谢
支持项目
Piggly Studio 是一家位于巴西里约热内卢的代理机构。如果您喜欢这个库并想支持这项工作,请自由地向 BTC 钱包 3DNssbspq7dURaVQH6yBoYwW3PhsNs8dnK 捐款 ❤。
许可证
MIT 许可证 (MIT)。请参阅 LICENSE。