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出错响应的设计的更多相关文章

  1. REST API出错响应的设计(转)

    REST API应用很多,一方面提供公共API的平台越来越多,比如微博.微信等:一方面移动应用盛行,为Web端.Android端.IOS端.PC端,搭建一个统一的后台,以REST API的形式提供服务 ...

  2. vs设计界面出现“建控件时出错 响应在此上下文中不可用”

    使用VS2010设计Asp.net时出现: 只有在配置文件或 Page 指令中将 enableSessionState 设置为 true 时,才能使用会话状态.还请确保在应用程序配置的 \\ 节中包括 ...

  3. Windows 10 响应式设计和设备友好的开发

    使用Effective pixels有效像素设计UI 什么是缩放像素和Effective有效像素: 当你的应用程序运行在Windows的设备,系统用一个算法控制的规范,字体,和其他UI元素显示在屏幕上 ...

  4. Web API核查表:设计、测试、发布API时需思考的43件事[转]

    Web API核查表:设计.测试.发布API时需思考的43件事   当设计.测试或发布一个新的Web API时,你是在一个原有的复杂系统上构建新的系统.那么至少,你也要建立在HTTP上,而HTTP则是 ...

  5. 通过媒体查询来实现 WPF 响应式设计

    WPF 客户端经常需要运行在各种不同大小屏幕下,为了显示友好,所以开发的时候都需要考虑响应式设计. 布局往往通过指定比例,而不直接指定准确的大小来实现响应式布局(如 Width="3*&qu ...

  6. RESTful Api 身份认证安全性设计

    REST是一种软件架构风格.RESTful Api 是基于 HTTP 协议的 Api,是无状态传输.它的核心是将所有的 Api 都理解为一个网络资源.将所有的客户端和服务器的状态转移(动作)封装到 H ...

  7. Windows10 UWP开发 - 响应式设计

      Windows10 UWP开发 - 响应式设计 本篇随笔与大家简单讨论一下在开发适配不同分辨率.宽高比的Windows10 Universal App布局时的可行方式与小技巧.经验均从实践中总结, ...

  8. Grid – 入门必备!简单易懂的响应式设计指南

    如今,人们使用各种各样的移动设备访问网页,设计师们需要去适配不同的屏幕,让用户在都能有最佳的浏览体验.Grid 是一个简单的响应式设计指南,按照这些简单的步骤,你的就能够掌握基础的响应网页设计技巧. ...

  9. HTML5实践 -- 使用CSS3 Media Queries实现响应式设计

    CSS3 Media用法介绍:http://www.w3cplus.com/content/css3-media-queries 转载请注明原创地址:http://www.cnblogs.com/so ...

随机推荐

  1. 轻量级MVC框架:Nancy学习

    一.认识Nancy 今天听讲关于Nancy框架的培训,被Nancy的易用性所吸引.故晚上回来梳理了一下知识. 什么是Nancy呢?如标题所述,Nancy是一个轻量级的独立的框架: Nancy 是一个轻 ...

  2. 新手的第一个phonegap Android应用

    对PhoneGap开发感兴趣的请加入群 PhoneGap App开发 348192525   手机成为现在软件应用必不可少的一种设备,然而手机平台的不统一造成我们需要为不同手机重写代码,这对一般应用来 ...

  3. C#可扩展编程之MEF学习笔记(五):MEF高级进阶

    好久没有写博客了,今天抽空继续写MEF系列的文章.有园友提出这种系列的文章要做个目录,看起来方便,所以就抽空做了一个,放到每篇文章的最后. 前面四篇讲了MEF的基础知识,学完了前四篇,MEF中比较常用 ...

  4. java提高篇(十五)-----关键字final

    在程序设计中,我们有时可能希望某些数据是不能够改变的,这个时候final就有用武之地了.final是java的关键字,它所表示的是“这部分是无法修改的”.不想被改变的原因有两个:效率.设计.使用到fi ...

  5. 浅谈Excel开发:五 Excel RTD函数

        上文介绍了Excel中的UDF函数,本文介绍一下同样重要的RTD函数.从Excel 2002开始,Excel引入了一种新的查看和更新实时数据的机制,即real-time data简称RTD函数 ...

  6. JavaScript思维导图—Window对象

    JavaScript思维导图-来自@王子墨http://julying.com/blog/the-features-of-javascript-language-summary-maps/

  7. iOS——Core Animation 知识摘抄(一)

    本文是对http://www.cocoachina.com/ios/20150104/10814.html文章的关键段落的摘抄,有需要的看原文 CALayer和UIView的关系: CALayer类在 ...

  8. 如何在CRM系统中集成ActiveReports最终报表设计器

    有时候,将ActiveReports设计器集成到业务系统中,为用户提供一些自定义的数据表,用户不需要了解如何底层的逻辑关系和后台代码,只需要选择几张关联的数据表,我们会根据用户的选择生成可供用户直接使 ...

  9. 网络误区:不用中间变量交换2个变量的value,最高效的是异或运算.

    本文记录了不使用中间变量交换2个变量的value,很多的网络留言说是直接异或运算就可以了,而且效率很高,是真的吗? 这里简单的说一下我的环境:Win7 32位,Qt creator 5.4.1 编译器 ...

  10. 每天一个linux命令(55):traceroute命令

    通过traceroute​我们可以知道信息从你的计算机到互联网另一端的主机是走的什么路径.当然每次数据包由某一同样的出发点(source)到达某一同样的目的地(destination)走的路径可能会不 ...