[Yii2笔记]075 RESTful的错误处理(Error Handling) [ 技术分享 ]
说明
学习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参数传递时,将重新格式化响应(包括成功和失败的响应)。
(全文完)
共 0 条回复
阿江
最后登录:2024-03-03
在线时长:186小时21分
- 粉丝94
- 金钱16816
- 威望160
- 积分20276