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。