nilportugues/api-problems
PSR7 响应实现 HTTP API 的问题细节
1.2.3
2016-07-23 21:27 UTC
Requires
- guzzlehttp/psr7: ^1.3
- nilportugues/assert: ^1.0
- psr/http-message: ^1.0
Requires (Dev)
- fabpot/php-cs-fixer: ~1.9
- phpunit/phpunit: 4.*
README
PSR7 响应实现 HTTP API 的问题细节(RFC7807) 规范。
使用方法
要报告单个错误,只需传递必填参数即可。
简单使用(推荐)
这可能是最快的方式,而且非常方便,因为它会隐藏呈现器和为您创建实例。
use NilPortugues\Api\Problem\ApiProblemResponse; $additionalDetails = []; //you may pass additional details too. /**@var $response is a PSR7 response */ $response = ApiProblemResponse::json(404,'User with id 5 not found.', 'Not Found', 'user.not_found', $additionalDetails); $response = ApiProblemResponse::xml(404,'User with id 5 not found.', 'Not Found', 'user.not_found', $additionalDetails); $response = ApiProblemResponse::fromExceptionToJson($exception); $response = ApiProblemResponse::fromExceptionToXml($exception);
使用构造函数并自行处理响应。
use NilPortugues\Api\Problem\ApiProblem; use NilPortugues\Api\Problem\ApiProblemResponse; use NilPortugues\Api\Problem\Presenter\JsonPresenter; $apiProblem = new ApiProblem( 404, 'User with id 5 not found.', 'Not Found', 'user.not_found' ); $presenter = new JsonPresenter($apiProblem); //or XmlPresenter return new ApiProblemResponse($presenter);
使用异常并自行处理响应。
use NilPortugues\Api\Problem\ApiProblem; use NilPortugues\Api\Problem\ApiProblemResponse; use NilPortugues\Api\Problem\Presenter\JsonPresenter; try { //...your code throwing an exception throw new \Exception('User with id 5 not found.', 404); } catch(\Exception $exception) { $problem = ApiProblem::fromException($exception); $presenter = new JsonPresenter($apiProblem); //or XmlPresenter return new ApiProblemResponse($presenter); }
多个问题,一个对象
要报告多个问题,必须使用额外的详细信息参数。
use NilPortugues\Api\Problem\ApiProblem; use NilPortugues\Api\Problem\ApiProblemResponse; use NilPortugues\Api\Problem\Presenter\JsonPresenter; try { // some code of yours throws an exception... for instance: throw new \Exception('User data is not valid.', 500); } catch(\Exception $exception) { $additionalDetails = [ 'errors' => [ ['name' => 'username', 'error' => 'Username must be at least 5 characters long.'], ['name' => 'email', 'error' => 'Provided address is not a valid email.'], ], ] $apiProblem = ApiProblem::fromException( $exception, 'Input values do not match the requirements', 'user.invalid_data', $additionalDetails; ); $presenter = new JsonPresenter($apiProblem); //or XmlPresenter return new ApiProblemResponse($presenter); }
JSON 输出
头部
HTTP/1.1 500 Bad Request
Content-Type: application/problem+json
正文
{ "title": "Input values do not match the requirements", "status": 500, "detail": "User data is not valid.", "type": "user.invalid_data", "errors": [ { "name": "username", "error": "Username must be at least 5 characters long." }, { "name": "email", "error": "Provided address is not a valid email." } ] }
XML 输出
头部
HTTP/1.1 500 Bad Request
Content-Type: application/problem+xml
正文
<?xml version="1.0" encoding="UTF-8"?> <problem xmlns="urn:ietf:rfc:7807"> <title>Input values do not match the requirements</title> <status>500</status> <detail>User data is not valid.</detail> <type>user.invalid_data</type> <errors> <item> <name>username</name> <error>Username must be at least 5 characters long.</error> </item> <item> <name>email</name> <error>Provided address is not a valid email.</error> </item> </errors> </problem>
贡献
欢迎对包的贡献!
支持
以下方式之一与我联系
- 通过电子邮件 contact@nilportugues.com 发送给我
- 打开一个 问题
作者
许可证
代码库在 MIT 许可证 下授权。