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/
http://www.cnblogs.com/xinzhao/p/4904194.html
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 ...
随机推荐
- 询url包括字符串参数(js高度注意事项)
以防万一 url="http://write.blog.csdn.net/postedit? id=5&search=ok" function getArgs() { v ...
- Java 抽象工厂模式
抽象工厂模式(Abstract Factory Pattern)是工厂方法模式的进一步抽象,其英文原话"Provide an interface for creating families ...
- 下的生产环境was重新启动不同意,怎么做?
前一段时间上线.遇到一个jndi问题,它是如何是个问题?它是在测试环境中的原始没有问题,在生产环境中,您无法连接生产数据库,然后发现问题,那是,ibm工具生成在测试环境中自己主动的连接jndi资源文件 ...
- Android SDK 和 Eclipse ADT 离线安装 教程
因为google 被限制,就是FQ后,下载的速度依旧非常慢,让人非常崩溃啊,所以这里就分享一下离线安装android SDK 和eclipse ADT 离线安装方法. 安装之前首先已经确保java s ...
- iOS 辛格尔顿
单例模式: 为什么使用单例,单例模式的用途是什么?以下我们举一个样例来诠释一下 举个大家都熟知的样例--Windows任务管理器,如图,我们能够做一个这种尝试,在Windows的"任务栏&q ...
- Android - 和其他APP交互 - 获得activity的返回值
启用另一个activity不一定是单向的.也可以启用另一个activity并且获得返回值.要获得返回值的话,调用startActivityForResult()(而不是startActivity()) ...
- 未能加载文件或程序集“Common”或它的某一个依赖项。试图加载格式不正确的程序
原因:操作系统是64位的,但发布的程序引用了一些32位的ddl,所以出现了兼容性的问题解决方案一:如果是64位机器,IIS——应用程序池——高级设置——启用32位应用程序 :true.解决方案二:修改 ...
- GitLab 之 Linux十分钟快装(转)
先把 Shell 命令贴出来,楼主以 CentOS release 6.5 (Final) 64位 为例: //配置系统防火墙,把HTTP和SSH端口开放. sudo yum install curl ...
- ArcMap合并之路 -- 该段路合并成一个完整的路
#1: 用 Arctoolbox\Data Management Tools\Generalization\dissolve 工具 #2: Options:dissolve field 项选" ...
- 第七章——DMVs和DMFs(1)
原文:第七章--DMVs和DMFs(1) 简介: 从SQLServer2005开始,微软引入了一个名叫DMO(动态管理对象)的新特性,DMO可以分为DMFs(Dynamic Manage Functi ...