nilportugues/api-problems

PSR7 响应实现 HTTP API 的问题细节

1.2.3 2016-07-23 21:27 UTC

This package is auto-updated.

Last update: 2024-09-06 08:37:03 UTC


README

Build Status Scrutinizer Code Quality SensioLabsInsight Latest Stable Version Total Downloads License Donate

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>

贡献

欢迎对包的贡献!

支持

以下方式之一与我联系

作者

许可证

代码库在 MIT 许可证 下授权。