mirror of
				https://github.com/yiisoft/yii2.git
				synced 2025-11-04 14:46:19 +08:00 
			
		
		
		
	
		
			
				
	
	
		
			95 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
			
		
		
	
	
			95 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
Manejo de errores
 | 
						|
=================
 | 
						|
 | 
						|
Cuando se maneja una petición de API RESTful, si ocurre un error en la petición del usuario o si algo inesperado
 | 
						|
ocurre en el servidor, simplemente puedes lanzar una excepción para notificar al usuario que algo erróneo ocurrió.
 | 
						|
Si puedes identificar la causa del error (p.e., el recurso solicitado no existe), debes considerar lanzar una excepción
 | 
						|
con el código HTTP de estado apropiado (p.e., [[yii\web\NotFoundHttpException]] representa un código de estado 404).
 | 
						|
Yii enviará la respuesta a continuación con el correspondiente código de estado HTTP y el texto. Yii puede incluir también
 | 
						|
la representación serializada de la excepción en el cuerpo de la respuesta.
 | 
						|
Por ejemplo:
 | 
						|
 | 
						|
```
 | 
						|
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
 | 
						|
}
 | 
						|
```
 | 
						|
 | 
						|
La siguiente lista sumariza los códigos de estado HTTP que son usados por el framework REST:
 | 
						|
 | 
						|
* `200`: OK. Todo ha funcionado como se esperaba.
 | 
						|
* `201`: El recurso ha creado con éxito en respuesta a la petición `POST`. La cabecera de situación `Location`
 | 
						|
   contiene la URL apuntando al nuevo recurso creado.
 | 
						|
* `204`: La petición ha sido manejada con éxito y el cuerpo de la respuesta no tiene contenido (como una petición `DELETE`).
 | 
						|
* `304`: El recurso no ha sido modificado. Puede usar la versión en caché.
 | 
						|
* `400`: Petición errónea. Esto puede estar causado por varias acciones de el usuario, como proveer un JSON no válido
 | 
						|
   en el cuerpo de la petición, proveyendo parámetros de acción no válidos, etc.
 | 
						|
* `401`: Autenticación fallida.
 | 
						|
* `403`: El usuario autenticado no tiene permitido acceder a la API final.
 | 
						|
* `404`: El recurso pedido no existe.
 | 
						|
* `405`: Método no permitido. Por favor comprueba la cabecera `Allow` por los métodos HTTP permitidos.
 | 
						|
* `415`: Tipo de medio no soportado. El tipo de contenido pedido o el número de versión no es válido.
 | 
						|
* `422`: La validación de datos ha fallado (en respuesta a una petición `POST` , por ejemplo). Por favor, comprueba en el cuerpo de la respuesta el mensaje detallado.
 | 
						|
* `429`: Demasiadas peticiones. La petición ha sido rechazada debido a un limitación de rango.
 | 
						|
* `500`: Error interno del servidor. Esto puede estar causado por errores internos del programa.
 | 
						|
 | 
						|
 | 
						|
## Personalizar la Respuesta al Error <span id="customizing-error-response"></span>
 | 
						|
 | 
						|
A veces puedes querer personalizar el formato de la respuesta del error por defecto . Por ejemplo, en lugar de depender
 | 
						|
del uso de diferentes estados HTTP para indicar los diferentes errores, puedes querer usar siempre el estado HTTP 200
 | 
						|
y encapsular el código de estado HTTP real como parte de una estructura JSON en la respuesta, como se muestra a continuación,
 | 
						|
 | 
						|
```
 | 
						|
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
 | 
						|
    }
 | 
						|
}
 | 
						|
```
 | 
						|
 | 
						|
Para lograrlo, puedes responder al evento `beforeSend` del componente `response` en la configuración de la aplicación:
 | 
						|
 | 
						|
```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;
 | 
						|
                }
 | 
						|
            },
 | 
						|
        ],
 | 
						|
    ],
 | 
						|
];
 | 
						|
```
 | 
						|
 | 
						|
El anterior código reformateará la respuesta (sea exitosa o fallida) como se explicó cuando
 | 
						|
`suppress_response_code` es pasado como un parámetro `GET`.
 |