RESTful实践:如何设计API的错误消息

现有状况

发现很多RESTful API的错误代码都是用HTTP的状态码(Status Code)作为API的错误代码,公司的一些产品也是如此,如下图所示:

这种设计基本是把错误代码依次映射到HTTP的状态码上,HTTP协议中定义的状态码基本包含下面几类:

  • 1xx Informational
  • 2xx Success
  • 3xx Redirection
  • 4xx Client Error
  • 5xx Server Error

比如对一个常见的新增用户的API,返回的Code会设计如下:

  • 201 创建成功
  • 400 请求错误(验证不通过,输入错误)
  • 401 操作未授权
  • 409 用户已存在

这种设计虽然可以覆盖大多数的情况,但对于一些业务逻辑错的话,就没有对应的HTTP状态码匹配了。比如,新增用户的时候,发现用户组人数已经达到上限了,给一个什么样的状态码呢?或者发现数据库无法访问了,又给一个什么状态码呢?

HTTP状态码是HTTP协议的一部分,应用层的API是不应该知道下层协议的细节的。假如有其他的业务错误无法对应上现有的HTTP状态码,岂不是还的自己扩展出更多的状态码?这样也会导致HTTP状态码和业务耦合,无论是服务端还是客户端。

设计方案

我的设计方案是,所有RESTful Web Service返回结果的结构都相同,不考虑改变HTTP返回的状态吗,而只是在返回结果中表明状态和错误信息,大致结构如下:

{success:true|false, data:[]|{} [, error_code:, error_message:] }
通过success字段来表明这个请求的成功或失败;如果成功,则可以读取data数据进行后续处理;如果失败,可以读取error_code和error_message进行错误的处理。这样的好处就是,既不用关心HTTP状态码,也不用对成功或失败来处理不同的JSON结构。

一些常见的设计

  • Facebook

    自定义错误代码,HTTP状态码统一为200。
    {
    “error”: {
    “message”: “(#803) Some of the aliases you requested do not exist: me1”,
    “type”: “OAuthException”,
    “code”: 803
    }
    }

  • 新浪
    使用自定义错误代码,错误的HTTP状态码是400。 http://open.weibo.com/wiki/Error_code
  • 腾讯
    使用自定义错误代码,错误的HTTP状态码统一是200。
    http://wiki.open.qq.com/wiki/%E5%85%AC%E5%85%B1%E8%BF%94%E5%9B%9E%E7%A0%81%E8%AF%B4%E6%98%8E
  • 阿里巴巴

    自定义错误代码,不需要关心HTTP状态码
    {
    “error_code”:“450”,
    “error_message”:“Required argument memberId : expect [type: java.lang.String]“,
    “exception”:“Required argument memberId : expect [type: java.lang.String]”
    }

时间: 2024-11-04 12:18:35

RESTful实践:如何设计API的错误消息的相关文章

用产品思维设计API(一)——RESTful就是个骗局

用产品思维设计API(一)--RESTful就是个骗局 前言 最近公司内部在重构项目代码,包括API方向的重构,期间遇到了很多的问题,不由得让我重新思考了下. - 一个优雅的API该如何设计? - 前后端分离之后,API真的解耦分离了吗? - 不断的版本迭代,API的兼容性该如何做? 年前,我司内部的接口已经进入了一个完全的重构阶段,参考了市面上各大平台的API和文档,自己也总结出了很多的心得.这里向大家分享一下,接下来一个月,我们向从下面几个方面向大家介绍一个优雅的API(至少我认为挺优雅)该

RESTFUL如何指导WEB API设计?

博主刚刚接触web开发的时候,写了一个接口 /get_article_info/1 获取id为1的这篇文章的内容,被前辈们看见了,前辈给我说我这个接口设计的不太好啊,不符合RESTFUL规范,当前辈们说出这些话的时候,我很迷惑,我写的接口不能够好好工作吗?能够正常返回内容啊,对于不存在的文章也能够在返回的内容体中提示不存在,而且接口的意思很明确,一看就能明白,这还有什么不好的地方吗? 一.RESTFUL是什么? RESTFUL是英文单词Representational State Transfe

14.app后端如何设计api

app和后端的交互,一般都是通过后端提供的api实现.api的设计,估计很多刚进入app后端的小伙伴会一无头绪,不知道怎么入门.下面根据自己3年的app后端经验,总结出下几个api设计原则,给小伙伴参考. 1. 什么是api? 这个问题在以前发表的文章"7.app和app后端的通讯"中其实已经回答了,这里再重复一次. 相信大家都用过银行的柜员机(ATM)的查询余额,转帐,取款等操作. 当在柜员机取款的时候,我们输入要取款的金额,隔一会钱就出来了,如果因为有什么问题不能取款(例如超过取款

用产品思维设计API(三)——版本控制,没有你想的这么简单

用产品思维设计API(三)--版本控制,没有你想的这么简单 前言 最近公司内部在重构项目代码,包括API方向的重构,期间遇到了很多的问题,不由得让我重新思考了下. - 一个优雅的API该如何设计? - 前后端分离之后,API真的解耦分离了吗? - 不断的版本迭代,API的兼容性该如何做? ps.这里所说的API仅为Web API,提供APP\WEB开发使用. 年前,我司内部的接口已经进入了一个完全的重构阶段,参考了市面上各大平台的API和文档,自己也总结出了很多的心得.这里向大家分享一下,接下来

用产品思维设计API(二)——数据解耦,才是前后分离的本质

用产品思维设计API(二)--数据解耦,才是前后分离的本质 前言 最近公司内部在重构项目代码,包括API方向的重构,期间遇到了很多的问题,不由得让我重新思考了下. - 一个优雅的API该如何设计? - 前后端分离之后,API真的解耦分离了吗? - 不断的版本迭代,API的兼容性该如何做? ps.这里所说的API仅为Web API,提供APP\WEB开发使用. 年前,我司内部的接口已经进入了一个完全的重构阶段,参考了市面上各大平台的API和文档,自己也总结出了很多的心得.这里向大家分享一下,接下来

您在基于 Windows 7 的或基于 Windows Server 2008 R2 的计算机上读取器中插入智能卡时出现错误消息:"设备驱动程序软件未能成功安装"

http://support.microsoft.com/kb/976832/zh-cn http://support.microsoft.com/kb/976832/zh-tw 症状 当智能卡插入智能卡阅读器后时,Windows 尝试下载并安装智能卡 minidrivers 通过插服务卡.如果自定义的加密服务提供程序未在系统上安装智能卡的驱动程序在任一预配置位置,如 Windows 更新. WSUS 或 intranet 路径不可用,在通知区域中将收到以下错误消息: 未能成功安装设备驱动程序软

常犯的一些网页设计的可用性错误

本文来源:e良师益友网 在过去十年中高品质的可用性一直是业内讨论的核心,因为它对用户来说越来越重要.好的可用性也可以帮助建立品牌知名度,从而提升用户对一个网站或者是一家公司的评价.今天人们依然高度关注可用性,是因为大大小小的公司已经证明了好的可用性策略是多么重要.在对该话题年复一年的讨论之后,似乎web设计者们仍然很难去理解它.可用性早已不再是一个玩笑,下面这些建议应当被打印出来并粘到你桌子对面的墙上. 链接的颜色 经 常发现自己在浏览网页时,有些页面上的链接没有以某种形式高亮显示.这是最愚蠢的

Jquery Validate高级定制: 传入正则表达式,传入错误消息

背景:    Jquery Validate在网上能够找到的资料都是固定一种验证方式,大家讨论的都是正则表达式如何写的问题. 在工作实践中,找到一个可以动态传入正则表达式的方法,跟大家共享下,希望能够抛砖引玉. 功能描述: 传入正则表达式,传入错误消息 详细 项目中规则都是自动定义的,当然比较简单.可以动态增加验证规则.复杂点的可以自己写正则表达式.话不多说看代码. jQuery.validator 加一个扩展 jQuery.validator.addMethod("diyCheck"

错误代码以及错误消息提示-如何更好地管理与维护消息资源

错误代码以及错误消息是开发过程中不可避免会碰到的问题,虽然对于开发技巧并没有多高的要求,但是清晰地管理好这些资源对于整个项目或者产品的开发都是百益而无一害的.    1)明晰代码模块以及更好地梳理代码流程    2)便于PM和前方客户沟通    3)方便校验和国际化处理 从开发的角度,如何更好地管理好这些错误资源文件呢? 结合平常实际开发经验,总结出从几个方面实现明晰的错误消息管理.   一.错误消息规则 错误消息是一组由JSON格式表示的字符串,例如:{"error_code":&q