当我返回200时,我在返回什么?

11 篇文章 0 订阅
7 篇文章 0 订阅

        一名用户正试图使用手机号在一款互联网应用上注册新账户。当他填完手机号和验证码,点击提交按钮后,服务器向他的客户端返回了一条状态码为200的响应,响应体的内容是:

{
    "code": 10086,
    "error": "验证码过期"
}

服务器向他的客户端返回了错误代码和错误描述信息,以告知客户端究竟发生了什么。

       问题正出在这里。关于Restful风格的探讨,经常纠结于一个失败的结果(或者称为“消极”的结果),究竟该返回200的状态码,然后用自定义错误代码来告知客户端错误类别;还是使用标准的HTTP状态码,例如403?再举一例,对地址“/student/123”的请求(该请求表示一个学号为123的学生信息),如果学号为123的学生不存在,那么状态是返回200,在响应体内描述“该学生不存在”;还是返回404来表示该资源未找到?

       那么显而易见,对于客户端的开发人员来讲,如果返回404,开发人员会一定会感到迷惑,是url拼错了,还是请求按照预期的业务逻辑执行了,但学号123的学生的确不存在?

       让我们回到Rest本身来探讨这个问题。Roy Fielding博士在他的博士论文中提出了Rest风格,并指出应当使用标准HTTP状态码来描述请求处理的状态。REST风格要求URI中不出现动词,而是用名词来描述资源,用HTTP方法描述动作。这是因为,在Rest风格中,一切请求的目的都应该是对资源状态的操作。换句话说,在REST中,“一切皆资源”。例如,当一个接口的作用是启动机器时,这个接口的URI应该怎么设计呢?通常我们会认为“启动”是一个动作,应该是“startup”这样的动词,因此这个接口的URI可能设计为“/machine/startup”。但我们可以把机器认为是一类资源,打开机器则是对机器状态的修改,因此可以设计这样一个接口:“PUT /machine/1?status=startup ”,这个接口用来修改id为1的机器,或者,我们把“启动机器事件”作为一种资源,那么可以这样设计URI:“POST /startupAction?id=1”。 

       当了解Rest一切皆资源的原则后,理解学号123的学生不存在而返回404也就很轻松了。Rest风格所要实现的一个目的就在于,将URI设计为可表示暴露在WWW上的一个资源,而任何与WWW上内容的交互都可以抽象为对资源的CRUD。因此,"/studen/123"所请求的资源就是一个学生的信息,就像"/电影/复仇者联盟4.mp4"或"/音乐/光年之外.mp3"一样。对于API的调用者来说,/student/123是一个万维网上的资源,而这个资源是不是MVC中的Controller处理的,是动态或是静态的,对于调用者来说是不关心的。这使得“student/123”就像躺在远程服务器中的一个文件,像“复仇者联盟4.mp4”那样。如果复仇者联盟4.mp4在远程服务器上不存在,那么我们是不是应该得到一个404?同样,学号123的学生不存在,说明“/student/123”在www上所代表的资源是不存在的。

       因此,我们马上就能理解:REST与语义网是相关的。REST的一个特点是重视语义,推荐通用的风格来实现语义的统一,从而实现接口的自我描述。大多数情况下人们认为REST就是视图与数据的分离,其实这远远没有达到REST真正想实现的高度。

       但在工程上,设计一个完备的REST接口不是一件容易的事情。如果一个接口的处理结构有8种不同的可能,要将每种分支匹配到HTTP状态码上是很困难的,很可能现有的状态码是不足的。此外,不同的开发、设计人员对于RFC2616规范的理解不尽相同,同样的处理失败,我们是该返回4xx还是5xx呢?或者,我们应该按照面向资源的风格来设计该接口,将各个分支归类于不同的资源,但这样无疑大大增加了开发人员在语义分析上的压力。对于工程来讲,如何实现低成本、高效率、大规模的开发是每个工程师的实践原则。而减少对接口返回值的歧义,降低前后端开发人员之间的沟通成本,正是高效率实现SaaS迭代一个重要途径。毕竟REST是一种学术上的研究,在工程与应用技术上,每个人的考虑不尽相同。

       所以,当我返回200时,我在返回什么?我在告诉调用者,这个请求按照预期的业务流程处理了,虽然结果有可能在业务逻辑上属于消极的。如果你收到了一个2xx以外的响应码,这说明该响应码是由Web服务器或者外部框架返回的。很可能这次请求引发了一个bug,因为这是一个预期业务逻辑之外的,不是由开发人员所设计的结果。

       完全实现REST并不简单,大多数开发者都采用了折中的做法,即HTTP状态码和自定义代码相结合,或者采用200表示业务流程成功执行,让外部框架返回2xx以外的响应。REST毕竟是一种风格,而非强制标准,因此适合自己的风格对企业来说可能是最重要的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值