Restful API的设计与实践

Restful这个名称应该很多人都不陌生,但是我发现不少人对Restful存在或多或少的理解偏差,其中不泛比较厉害的程序员,所以有必要为Restful来“正名”。

Restful是一种软件架构风格,设计风格而不是标准,只是提供了一组设计原则和约束条件。它主要用于客户端和服务器交互类的软件。基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制。(详见百度百科介绍

Restful的关键是抽取资源,使用URL与资源进行对应。这边也是多数人理解有偏差之处,即Restful应该理解为面向资源的架构风格,URL的设计应该是从资源的角度出发,而不应有任何的“动作”设计,其中单个资源共享同一个接口,而不同的“动作”通过请求的方法进行区分。这也是和RPC调用方式或RPC-Restful混合调用方式最大的不同之处。

那么为什么要使用Restful风格?有什么优势?

1、统一接口:约定大于配置,有了统一的规范,大家在接口设计时能够保证理解的一致性,这样首先便于接口的理解。另外同一资源URL一致,不同的CURD操作通过不同的Http协议方法进行区分,这样在设计上做到了简化。统一接口还有个非常容易被忽视的好处,就是方便使用Http协议自带的缓存机制对请求进行缓存操作,这样在一定程度上又提高了请求的性能。

2、无状态性:由于使用Http协议进行调用,每个请求都包含了服务器所需的全部信息,所以这种方式非常适用于异构系统之间的调用,同时也良好地支持分布式架构,可以动态地扩展服务器。这也是一个非常明显的优势。

Restful风格非常好,具体如何设计?

1、提取资源: 这一步非常关键,也是Restful的核心思想所在。在面向对象的世界里,对于资源的识别不算太难,一般情况下资源即是想要处理的对象,如果对应到表结构上面,可能就是表对应的实体。例如电子商务网站上的下订单,那资源就是订单;如果是商品展示,那资源就是商品。当然这是最简单的情况,如果稍微复杂一点,比如现在是家电类的商品展示怎么办呢?那资源就是商品-家电类。像上面所述的情况,资源比较好识别,而有些情况下资源就不是那么明显了,比如登录,这是哪门子资源?这种情况确实不太好抽象,不过可以理解为登录信息资源。登录操作是对登录信息资源的新增操作。还有其它更复杂的情况,这个就得发挥面向资源的思路做进一步的抽象了。

2、URI设计: URI的设计其实与资源提取紧密相关,基本只要资源提取出来了,URI只是相应地翻译成地址就可以,有层级的资源通过分隔符进行路径区分。例如上面提到的商品展示可以是/goods,家电类商品可以/goods/elecequipt/,而登录可以是/loginInfo。

3、具体的动作: 这个严格说来并不是设计的一部分,是属于规范的一部分。因为使用Http协议,而协议中正好有相应的方法支持,所以正好使用Http协议的方法。(1)GET:获取资源的方法;(2)PUT:更新资源的方法;(3)POST:创建资源的方法;(4)DELETE:删除资源的方法。这几个 是比较常用的,还有几个不太常用的方法:(5)OPTIONS:查看资源支持哪些方法;(6)HEAD:与PUT类似,只不过HEAD只返回报头,不返回表示。
这里需要着重提一下,很多Restful-RPC混合模式可能就只会使用POST方法,这里就是混合模式与Restful风格最明显的区别之一。

4、返回结果: 返回结果包括Http请求的状态码和资源的表述。很多情况下API的返回结果使用Json或者XML格式表示,而Json是更加常用的。因为Json相比XML更加轻量,这样在传输过程中资源更小传输更快,另外Json的解析支持更广,所以解析起来非常方便。

5、缓存: Http协议是天然支持缓存的,这个也有利于性能的提升。当然服务端也可以添加缓存提高性能,这是另一个话题。缓存具体的实现在Http Header里面进行设置,例如Cache-Control、Expires。具体用法可以参见协议头描述:http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html

6、安全性: 如果资源是公开的,那也没有什么安全性可言了。但是实际情况是很多资源是有对应的“权限”进行操作的,这个时候就需要进行身份的认证,认证才能够进行相应的操作。所以安全性也是设计中很重要的一环。
那么安全性如何保证呢?在Http协议中有Authorization头可以进行相关设置,最基本的可以使用Basic方式,更加安全的加密方式使用Digest方式,更进一步提高安全性还可以使用第三方的OAuth协议进行认证,OAuth也是经常采用的方式。具体使用可参考网上看到的一篇非常好的博文:理解OAuth2.0。另外为了安全性的保证,大多数情况下还会选用https协议进行传输。

设计的思路有了,那么该如何付诸实践?

1、使用场景: 前面也提到了,Restful风格特别适合于异构系统之间的调用,另外在分布式场景中也比较适用。比如现在移动端APP的接口设计很多都采用这种风格,另外有不少云平台提供的服务接口也大多采用Restful风格设计。使用还是比较广泛的。

2、实践示例: 说了半天理论还是略显空洞,下面直接来点示例加深下理解。限于篇幅,这里推荐几个看到的比较好的例子。
简单情况下的使用示例可以参考网上看到的一篇非常好的博文:理解Restful架构
稍微复杂一点的情况可以考虑现在比较知名的云平台的API设计,比如百度云推送API设计:http://push.baidu.com/doc/restapi/restapi。另外还推荐一个看到的Saas服务商的Restful设计文档,写得很好,环信的聊天API设计:http://docs.easemob.com/doku.php?id=start:100serverintegration
这边有几个有意思的地方可以特别关注下,比如API中的安全认证设计、接口输入输出设计。另外如果看得仔细,可能会注意到百度云平台推送平台的API设计可能与前面提到的Restful本身的设计思路有些出入,百度云推送的设计方式严格说来应该算是Restful-Rpc混合模式的设计。不过也不影响做为参考。

3、框架支持: 这里以Java版本的为例。Java对于Restful有一个规范定义JAX-RS,而支持Restful框架也不少,比如:RestletJerseyRESTEasyCXF。这几个框架的比较可以参考这篇博文:http://www.infoq.com/cn/news/2008/10/jaxrs-comparison/。我对Restlet和Jersey进行了简单了解,没有做深入的使用,觉得Restlet的文档是做得更好的。
除了上面提到的框架,现在非常流行的Spring MVC框架也对Restful有良好的支持,比如可以参考这篇的实践:http://www.importnew.com/7903.html,Spring框架的支持还是非常不错的。

参考资料

1、《RESTful Java with JAX-RS 2.0》
2、《RESTful Web APIs》
3、《RESTful Web Services Cookbook》中文版
4、《RESTful Web Services》中文版
5、《REST实战》中文版

时间: 2024-08-06 00:39:41

Restful API的设计与实践的相关文章

RESTful API的设计原则

最近一直在做公司的一个API平台的项目,前后大约有半年多了,中间穿插了好多其他的项目一起做的.上周经理要求写文档,我就重新打开项目开始检阅之前的代码,发现好多地方当初设计的并不合理,忽然就想到,一个好的API平台,应该怎么来设计呢?有哪些规范要遵守呢?面对自己的项目,感觉好多地方都要改,但是已经有人在用了,怎么办?全都要改动吗?所以就上网找解决方案,然后就发现一精品贴,现转载过来,以备不时查阅. 原文地址:http://www.cnblogs.com/moonz-wu/p/4211626.htm

好RESTful API的设计原则

说在前面,这篇文章是无意中发现的,因为感觉写的很好,所以翻译了一下.由于英文水平有限,难免有出错的地方,请看官理解一下.翻译和校正文章花了我大约2周的业余时间,如有人愿意转载请注明出处,谢谢^_^ Principles of good RESTful API Design 好RESTful API的设计原则 Good API design is hard! An API represents a contract between you and those who Consume your da

atitit.基于http json api 接口设计 最佳实践 总结o7

atitit.基于http  json  api 接口设计 最佳实践 总结o7 1. 需求:::serverand android 端接口通讯 2 2. 接口开发的要点 2 2.1. 普通參数 meth,param, 2 2.2. 全部的參数定义 2 2.3. key,dynami key)韩式 static key? 2 2.4. 防篡改 sign 2 2.5. Encry加密 3 2.6. zip压缩:: 3 2.7. 首先压缩韩式加密??? 3 3. 选型大全:rim ,ws, http 

[转]10个有关RESTful API良好设计的最佳实践

Web API已经在最近几年变成重要的话题,一个干净的API设计对于后端系统是非常重要的. 通常我们为Web API使用RESTful设计,REST概念分离了API结构和逻辑资源,通过Http方法GET, DELETE, POST 和 PUT来操作资源. 下面是进行RESTful Web API十个最佳实践,能为你提供一个良好的API设计风格. 1.使用名词而不是动词 Resource资源 GET读 POST创建 PUT修改 DELETE /cars 返回 cars集合 创建新的资源 批量更新c

10个有关RESTful API良好设计的最佳实践

Web API已经在最近几年变成重要的话题,一个干净的API设计对于后端系统是非常重要的. 通常我们为Web API使用RESTful设计,REST概念分离了API结构和逻辑资源,通过Http方法GET, DELETE, POST 和 PUT来操作资源. 下面是进行RESTful Web API十个最佳实践,能为你提供一个良好的API设计风格. 1.使用名词而不是动词 Resource资源 GET读 POST创建 PUT修改 PATCH部分修改 DELETE /cars 返回 cars集合 创建

php后台对接ios,安卓,API接口设计和实践完全攻略,涨薪必备技能

2016年12月29日13:45:27 关于接口设计要说的东西很多,可能写一个系列都可以,vsd图都得画很多张,但是由于个人时间和精力有限,所有有些东西后面再补充 说道接口设计第一反应就是restful api 请明白一点,这个只是设计指导思想,也就是设计风格 ,比如你需要遵循这些原则 原则条件REST 指的是一组架构约束条件和原则.满足这些约束条件和原则的应用程序或设计就是 RESTful.Web 应用程序最重要的 REST 原则是,客户端和服务器之间的交互在请求之间是无状态的.从客户端到服务

RESTful API的十个最佳实践

WebAPI在过去几年里非常的盛行,我们很多以往的技术手段都慢慢的转换为使用WebAPI来开发,因为它的语法简单规范化,以及轻量级等特点,这种方式收到了广泛的推崇. 通常我们使用RESTFul(Representational State Transfer)的设计方式来设计Web api,这通常用来分离API结构了业务逻辑,它使用典型的HTTP方法,诸如GET,POST.DELETE,PUT来和资源进行交互. 以下是设计RESTful API的是个最佳实践: 1. 使用名词而不是动词 为了易于理

Flask restful api与blueprint结合实践

所需依赖: Flask Flask-RESTful Python2.7 备注:flask-restful不能和flask的render_template模板结合使用,因为restfulapi的设计不是为了在flask里直接返回html. 在使用restful时,使用前后端分离模式. 本文档不包含flask的认证登陆功能 restful说明 restful把所有url请求当做资源, 资源下的get方法对应get请求,post方法对应post请求,put方法对应put请求,delete方法对应del

RESTful API的设计与开发

自己做过关于RESTful API的培训,下载