REST API出错响应的设计
REST API应用很多,一方面提供公共API的平台越来越多,比如微博、微信等;一方面移动应用盛行,为Web端、Android端、IOS端、PC端,搭建一个统一的后台,以REST API的形式提供服务,也成为常见的开发模式。只是一个服务做得久了,就发现API的接口设计,如果能在一开始就好好设计一下,实在是功德无量的事。讨论API接口设计的文章已有不少,本文重点谈一谈当请求处理出现异常的时候,出错响应的内容和格式的设计。
比较自然的想法是,当有错误发生时,在响应中设置恰当的HTTP Status Code来指明这次请求是因为什么出错的。因为HTTP协议的标准性,绝大多数客户端可以理解收到的HTTP状态码,从而带来一致的体验。
但是,HTTP协议不可能定义出所有的出错可能,满足各种各样的服务的需求。事实上,用来表示请求出错的HTTP状态码只有24个,其中有18个4xx状态码用来表示客户端错误,6个5xx妆台码用来表示服务端错误。作为API的提供者,我们当然希望能够尽可能的规范我们的出错信息,提供更多的信息给调用者。因为API使用起来越是方便简单,客户就越有可能继续使用我们提供的服务,同时,当出现问题需要排查的时候,我们的工作也更加容易。
下面这个出错返回,列出了我认为错误信息里应当包含的内容。
{
"status": 404,
"code": 40483,
"message": "Oops! It looks like that file does not exist.",
"developerMessage": "File resource for path /uploads/foobar.txt does not exist. Please wait 10 minutes until the upload batch completes before checking again.",
"moreInfo": "http://www.mycompany.com/errors/40483",
"requestId": "x3kdsa32k23ds32e"
}
status
Status的内容与HTTP状态码内容相同,这个字段的存在,使得错误信息自包含,客户端只需要解析HTTP响应的body部分,就可以获取所有跟这次出错相关的信息。
code
自定义错误码。自定义错误码的长度和个数都可以自己定义,这样就突破了HTTP状态码的个数限制。例子中的错误码是40483,其中404代表了请求的资源不存在,而83则制定了这次出错,具体是哪一种资源不存在。
message
用户可理解的错误信息,应当根据用户的locale信息返回对应语言的版本。这个错误信息意在返回给使用客户端的用户阅读,不应该包含任何技术信息。有了这个字段,客户端的开发者在出错时,能够展示恰当的信息给最终用户。
developerMessage
该出错的详细技术信息,提供给客户端的开发者阅读。可以包含Exception的信息、StackTrace,或者其它有用的技术信息。
moreInfo
给出一个URL,客户端开发站访问这个URL可以看到更详细的关于该种出错信息的描述。在该URL展示的网页中,可以包含该出错信息的定义,产生原因,解决办法等等。
requestId
请求ID,服务为每一个请求唯一生成一个请求ID,当客户端开发者无法自助解决问题时,可以联络服务开发者,同时提供该请求ID。一个好的服务,服务开发者应当可以根据此ID,定位到该次请求的所有相关log,进而定位问题,解决问题。
Reference
https://stormpath.com/blog/spring-mvc-rest-exception-handling-best-practices-part-1/
REST API出错响应的设计的更多相关文章
- REST API出错响应的设计(转)
REST API应用很多,一方面提供公共API的平台越来越多,比如微博.微信等:一方面移动应用盛行,为Web端.Android端.IOS端.PC端,搭建一个统一的后台,以REST API的形式提供服务 ...
- vs设计界面出现“建控件时出错 响应在此上下文中不可用”
使用VS2010设计Asp.net时出现: 只有在配置文件或 Page 指令中将 enableSessionState 设置为 true 时,才能使用会话状态.还请确保在应用程序配置的 \\ 节中包括 ...
- Windows 10 响应式设计和设备友好的开发
使用Effective pixels有效像素设计UI 什么是缩放像素和Effective有效像素: 当你的应用程序运行在Windows的设备,系统用一个算法控制的规范,字体,和其他UI元素显示在屏幕上 ...
- Web API核查表:设计、测试、发布API时需思考的43件事[转]
Web API核查表:设计.测试.发布API时需思考的43件事 当设计.测试或发布一个新的Web API时,你是在一个原有的复杂系统上构建新的系统.那么至少,你也要建立在HTTP上,而HTTP则是 ...
- 通过媒体查询来实现 WPF 响应式设计
WPF 客户端经常需要运行在各种不同大小屏幕下,为了显示友好,所以开发的时候都需要考虑响应式设计. 布局往往通过指定比例,而不直接指定准确的大小来实现响应式布局(如 Width="3*&qu ...
- RESTful Api 身份认证安全性设计
REST是一种软件架构风格.RESTful Api 是基于 HTTP 协议的 Api,是无状态传输.它的核心是将所有的 Api 都理解为一个网络资源.将所有的客户端和服务器的状态转移(动作)封装到 H ...
- Windows10 UWP开发 - 响应式设计
Windows10 UWP开发 - 响应式设计 本篇随笔与大家简单讨论一下在开发适配不同分辨率.宽高比的Windows10 Universal App布局时的可行方式与小技巧.经验均从实践中总结, ...
- Grid – 入门必备!简单易懂的响应式设计指南
如今,人们使用各种各样的移动设备访问网页,设计师们需要去适配不同的屏幕,让用户在都能有最佳的浏览体验.Grid 是一个简单的响应式设计指南,按照这些简单的步骤,你的就能够掌握基础的响应网页设计技巧. ...
- HTML5实践 -- 使用CSS3 Media Queries实现响应式设计
CSS3 Media用法介绍:http://www.w3cplus.com/content/css3-media-queries 转载请注明原创地址:http://www.cnblogs.com/so ...
随机推荐
- Vagrant 启用 rsync
折腾了那么久,发现这些smb,nfs,virtualcfs,这些同步方案在windows下都不是最完美的.最完美的还是 rsync,我使用它同步windows上的代码,在windows浏览器中打开虚拟 ...
- chardet坑——比蜗牛还慢
需求 最近在做一个功能,使用python爬取网页然后保存到本地.其中遇到的一个难题是判断页面的编码方式.有问题就百度喽,当时我没想到自己去解决.一百度就找到了一个叫chardet的插件.大喜过望,试了 ...
- cobbler配置
:ks脚本关闭pxe,这样就不会重复安装 sed -i 's/pxe_just_once: 0/pxe_just_once: 1/g' /etc/cobbler/settings 6:TFTP服务器 ...
- RHEL5.8配置开机自动挂载磁盘
Linux环境中可以通过fstab来设置自动挂载磁盘或者共享存储,操作如下: fstab配置文件路径:/etc/fstab 每行代表一个存储位置. [root@appsrv01 ~]# cat /et ...
- Swift不同storyboard之间的交互
如何实现多个Storyboard之间的切换 正如大家所知道的,Main-board是·程序运行的入口,如果找不到就会抛出异常,打开plist文件可以看到关于Main-board的描述,特别的制定了其b ...
- 解剖SQLSERVER 第八篇 OrcaMDF 现在支持多数据文件的数据库(译)
解剖SQLSERVER 第八篇 OrcaMDF 现在支持多数据文件的数据库(译) http://improve.dk/orcamdf-now-supports-databases-with-mult ...
- 团队项目——站立会议DAY6
团队项目--站立会议 DAY6 团队成员介绍(5人):张靖颜.何玥.钟灵毓秀.赵莹.王梓萱 今日(2016/5/13),站立会议已进行了一周时间,大家将这一周所遇到的问题和 ...
- 【读书笔记】-- JavaScript数组
数组是一段线性分配的内存,它通过整数计算偏移并访问其中的元素.大多数的语言都会要求一个数组的元素是相同类型,但JavaScript数组可以包含任意类型. var misc = ['string', n ...
- java输出任意两个日期之间有多少天
package JingDian; import java.text.ParseException; import java.text.SimpleDateFormat; import java.ut ...
- [ZigBee] 14、Zigbee无线通信前奏——BasicRF 简单无线点对点传输协议
本工程不带zigbee协议栈,作为过渡 实验现象: 一个EB2530(终端A)定义为发射模块,另一个EB2530(终端B)定义为接收模块. 按EB2530(终端A)上的按键,无线控制另一个EB2530 ...