mirror of
				https://github.com/yiisoft/yii2.git
				synced 2025-10-31 18:47:33 +08:00 
			
		
		
		
	
		
			
				
	
	
		
			95 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
			
		
		
	
	
			95 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
| Error Handling
 | |
| ==============
 | |
| 
 | |
| When handling a RESTful API request, if there is an error in the user request or if something unexpected
 | |
| happens on the server, you may simply throw an exception to notify the user that something went wrong.
 | |
| If you can identify the cause of the error (e.g., the requested resource does not exist), you should
 | |
| consider throwing an exception along with a proper HTTP status code (e.g., [[yii\web\NotFoundHttpException]]
 | |
| represents a 404 status code). Yii will send the response along with the corresponding HTTP status
 | |
| code and text. Yii will also include the serialized representation of the
 | |
| exception in the response body. For example:
 | |
| 
 | |
| ```
 | |
| HTTP/1.1 404 Not Found
 | |
| 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
 | |
| 
 | |
| {
 | |
|     "name": "Not Found Exception",
 | |
|     "message": "The requested resource was not found.",
 | |
|     "code": 0,
 | |
|     "status": 404
 | |
| }
 | |
| ```
 | |
| 
 | |
| The following list summarizes the HTTP status codes that are used by the Yii REST framework:
 | |
| 
 | |
| * `200`: OK. Everything worked as expected.
 | |
| * `201`: A resource was successfully created in response to a `POST` request. The `Location` header
 | |
|    contains the URL pointing to the newly created resource.
 | |
| * `204`: The request was handled successfully and the response contains no body content (like a `DELETE` request).
 | |
| * `304`: The resource was not modified. You can use the cached version.
 | |
| * `400`: Bad request. This could be caused by various actions by the user, such as providing invalid JSON
 | |
|    data in the request body, providing invalid action parameters, etc.
 | |
| * `401`: Authentication failed.
 | |
| * `403`: The authenticated user is not allowed to access the specified API endpoint.
 | |
| * `404`: The requested resource does not exist.
 | |
| * `405`: Method not allowed. Please check the `Allow` header for the allowed HTTP methods.
 | |
| * `415`: Unsupported media type. The requested content type or version number is invalid.
 | |
| * `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.
 | |
| * `500`: Internal server error. This could be caused by internal program errors.
 | |
| 
 | |
| 
 | |
| ## Customizing Error Response <span id="customizing-error-response"></span>
 | |
| 
 | |
| 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 && 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.
 | 
