Fixes #2702: added doc about customizing error response format [skip ci]

This commit is contained in:
Qiang Xue
2014-09-07 12:40:50 -04:00
parent 9885aac0ae
commit b1e7c753ae
2 changed files with 53 additions and 2 deletions

View File

@ -17,7 +17,6 @@ Transfer-Encoding: chunked
Content-Type: application/json; charset=UTF-8 Content-Type: application/json; charset=UTF-8
{ {
"type": "yii\\web\\NotFoundHttpException",
"name": "Not Found Exception", "name": "Not Found Exception",
"message": "The requested resource was not found.", "message": "The requested resource was not found.",
"code": 0, "code": 0,
@ -42,3 +41,55 @@ The following list summarizes the HTTP status code that are used by the Yii REST
* `422`: Data validation failed (in response to a `POST` request, for example). Please check the response body for detailed error messages. * `422`: Data validation failed (in response to a `POST` request, for example). Please check the response body for detailed error messages.
* `429`: Too many requests. The request was rejected due to rate limiting. * `429`: Too many requests. The request was rejected due to rate limiting.
* `500`: Internal server error. This could be caused by internal program errors. * `500`: Internal server error. This could be caused by internal program errors.
## Customizing Error Response
Sometimes you may want to customize the default error response format. For example, instead of relying on
using different HTTP statuses to indicate different errors, you would like to always use 200 as HTTP status
and enclose the actual HTTP status code as part of the JSON structure in the response, like shown in the following,
```
HTTP/1.1 200 OK
Date: Sun, 02 Mar 2014 05:31:43 GMT
Server: Apache/2.2.26 (Unix) DAV/2 PHP/5.4.20 mod_ssl/2.2.26 OpenSSL/0.9.8y
Transfer-Encoding: chunked
Content-Type: application/json; charset=UTF-8
{
"success": false,
"data": {
"name": "Not Found Exception",
"message": "The requested resource was not found.",
"code": 0,
"status": 404
}
}
```
To achieve this goal, you can respond to the `beforeSend` event of the `response` component in the application configuration:
```php
return [
// ...
'components' => [
'response' => [
'class' => 'yii\web\Response',
'on beforeSend' => function ($event) {
$response = $event->sender;
if ($response->data !== null && !empty(Yii::$app->request->get['suppress_response_code'])) {
$response->data = [
'success' => $response->isSuccessful,
'data' => $response->data,
];
$response->statusCode = 200;
}
},
],
],
];
```
The above code will reformat the response (for both successful and failed responses) as explained when
`suppress_response_code` is passed as a `GET` parameter.

View File

@ -345,7 +345,7 @@ class Response extends \yii\base\Response
$headers = $this->getHeaders(); $headers = $this->getHeaders();
foreach ($headers as $name => $values) { foreach ($headers as $name => $values) {
$name = str_replace(' ', '-', ucwords(str_replace('-', ' ', $name))); $name = str_replace(' ', '-', ucwords(str_replace('-', ' ', $name)));
// set replace for first occurance of header but false afterwards to allow multiple // set replace for first occurrence of header but false afterwards to allow multiple
$replace = true; $replace = true;
foreach ($values as $value) { foreach ($values as $value) {
header("$name: $value", $replace); header("$name: $value", $replace);