区分正确返回与错误返回

大部分平台像微博,腾讯,都会把接口返回分为正常返回跟异常返回,在这里定义:
1、正常返回根据业务情况不同返回不同的数据结构
2、错误返回提供固定的数据结构用于向用户或开发人员提供异常的具体信息。

基于HTTP的错误识别

利用HTTP的状态码,可以很容易的区分接口返回是否错误。在这里定义:
1、http code = 200,正确返回
2、http code != 200,错误返回
为什么要这样区分?因为非200的返回会触发http客户端的异常机制,方便前端编写代码对错误进行统一处理。

静态错误跟动态错误

静态错误:系统主动抛出的错误,说明客户端请求不正确,需要进行调整,方可获取正确的结果。例如获取用户资料的接口,返回用户未登录的错误,客户端在执行登录后便可获取正确的返回。
动态错误:系统被动抛出的错误,同时将错误详细说明记录到系统日志,说明服务器端遭遇无法处置的错误,需要修bug了。例如获取用户资料的接口,返回索引超出的错误,客户端自己无法修复该错误。

错误代码

静态错误跟动态错误都有对应的错误代码。区别是静态错误代码是已知的,平台会提供错误代码表备查,客户端可以根据错误代码表的说明自行处置。动态错误代码是动态生成的,客户端接收到动态错误后,需要将代码提供给后台开发人员,开发人员可以在系统日志中找到对应的错误说明,修复问题。
静态错误代码格式:语义化的字符串,例如 User.01
动态错误代码格式:一串不重复的数字,例如 201911111212

错误代码表

平台提供错误代码表(静态错误代码表)供客户端备查。

错误返回的数据结构

{
    "path": "http://192.168.204.129:80/ihu/public/drug-used-plan/upload",
    "error_code": "User.02",
    "error_message": "用户未登录。",
    "error_detail": "access_token:69dc6077d7e049b712e5c74bfa9cd36a",
    "query_string": "XDEBUG_SESSION_START=PHPSTORM",
    "content": "drug_plan=%E6%96%99%E7%AD%92"
}

错误返回一共有四个字段:
1、path:发生错误的接口地址。
2、error_code:错误代码,这里分静态错误代码跟动态错误代码。
静态错误代码可以在错误代码列表中找到,是系统主动抛出的错误,非后台程序异常。前端只要调整请求方式,便能避免该错误。
动态错误代码属于后台程序异常,需要进行修复才能正常使用,对应的错误详情可以在系统日志中找到。
3、error_message:错误信息,该信息较为简短,是提供给用户参考信息或提示用户下一步的操作。
4、error_detail:错误详细,该信息提供必要的调试信息供开发人员调试错误。比如示例中返回错误,用户未登录,这里提供access token供开发人员确认系统是否有问题。
5、query_string, content:这里将request的对应query string跟body的内容返回,方便排查错误。

前后端交互整体架构图

交互架构图

案例

本人开发的项目,后台是thinphp5.1,前台是微信小程序(flyio)。
根据这套设计规则,自定义了thinkphp5.1的异常处理机制,用来返回特定的错误信息。在flyio定义了拦截机制,对错误进行统一处理。详见以下两篇文章。
自定义thinkphp5.1异常
自定义微信小程序flyio响应拦截

版权声明:如无特别声明,本文版权归 一年四季 所有,转载请注明本文链接。

(采用 CC BY-NC-SA 4.0 许可协议进行授权)

本文标题:《 RESTFUL错误返回设计 》

本文链接:https://www.yucanlin.cn/develop/RESTFUL%E5%BC%82%E5%B8%B8%E8%BF%94%E5%9B%9E%E5%AE%9A%E4%B9%89.html