阿江 2017-10-15 09:20:39 4769次浏览 0条回复 1 0 0

说明

学习Yii Framework 2易2框架的过程是漫长的也是充满乐趣的以下是我学习Yii2框架时对官网英文资料(请参见原文网址)的翻译和代码实现提供了较完整的代码供你参考不妥之处请多多指正

原文网址:

http://www.yiiframework.com/doc-2.0/guide-rest-error-handling.html

本文主题:RESTful的错误处理(Error Handling)

当处理一个RESTful API请求时,如果在用户请求中存在错误,或在服务器端发生了意外,你可以简单的抛出异常,以提醒 用户有错误发生。如果你可以确定错误原因(例如:请求资源不存在),你可以考虑抛出带有相应HTTP状态码的异常(如yii\web\NotFoundHttpException的状态码是404),Yii将发送带有相应的HTTP状态和文本的响应,Yii将在响应主体中包含序列化的错误异常,例如:

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
}

以下列出了Yii REST框架中的HTTP状态码: 200: OK.每件事件都如预期的一样。 201: 为POST请求已成功创建了一个资源。header头信息中包含指向新创建资源的URL。 204: 请求成功获取,响应包含没有主体的内容(如DELETE请求) 304: 资源没有被修改,你可以使用缓存版本。 400: 错误请求。这可能由于用户发出不同的动作造成,例如在请求主体中提供了无效的JSON数据,提供了无效的动作参数等。 401: 身份认证失败。 403: 认证用户无权访问指定的API端点。 404: 请求资源没有存在。 405: 方法不允许。请检查header头信息中的Allow,是否允许执行相应的HTTP方法。 415: 不支持的媒体类型。请求内容类型或版本号是无效的。 422: 数据验证失败(例如,在POST请求之后的响应中)。请检查响应主体以查看详细的错误信息。 429: 请求次数过多。因请求频率限制而导致的请求被拒。 500: 内部服务器错误。这是由于内部程序错误造成。

Customizing Error Response(自定义错误响应)

有时你可能要自定义默认的错误响应格式。例如,不使用HTTP状态描述错误信息,而是统一返回HTTP状态为200,将实际的HTTP状态码封装在响应的JSON结构体中,如下所示:

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
    }
}

要实现此目的,你可以在应用配置的response组件中响应beforeSend事件:

return [
	'components'=>[
		'response'=>[
			'class'=>'yii\web\Response',
			'on beforeSend'=>function($event){
				$respons=$event->sender;
				if($response->data!==null&&Yii::$app->request->get('suppress_response_code')){
					$response->data=[
						'success'=>$response->isSuccessful,
						'data'=>$response->data,
					];
					$response->statusCode=200;
				}
			},
		],
	],
];

上述代码在suppress_response_code作为GET参数传递时,将重新格式化响应(包括成功和失败的响应)。

(全文完)

    没有找到数据。
您需要登录后才可以回复。登录 | 立即注册