本文主要解决三个问题:
- 什么是RESTful?
- RESTful的优点是什么?
- RESTful的缺点是什么?
1. 什么是RESTful
RESTful,简而言之,就是使用URL来定位资源,用HTTP动词来描述操作。
这个即是其优点,又是其缺点:在所需要传递的信息可以被抽象成状态的时候,可以极大的简化URL,但是对于某些性质是行为的信息则无能为力。
比如:
GET /person/information 就指定拿到对方的信息
POST /person/information 就是增加一条个人信息
个人信息,我们可以使用JSON或者其他序列化形式,比如xml传输。
如果没有这种形式,那么可能我们会在URL之中直接写上对应的操作,例如:
GET /get_personal_information
GET /delete_personal_information
这种还只是在单词的命名和排序部分可能有问题,URL无法统一化。
但是像远古时代的前后端不分离,例如 JSP 这种前后端一起的形式,就和RESTful天差地别了。
1.1 RESTful 和 传统的接口形式区别在哪?
RESTful 之中前端负责渲染页面,后端要做的只是将页面上面的内容填充进去,传递的是一个“资源”。
比如我们要一个个人信息的展示页面,那么在传统的前后端不分离的架构之中,后端可能要写html,包括一些其他的格式上面的东西。但是在RESTful之中,这些格式相关的全都由前端去做,后端只需要传递这个人的“个人信息”。
2. RESTful的优点
-
可以服务多种Client,比如Web,IOS和Android。另外对于不需要前端或者个人无法开发的前端,比如微博开放平台,Facebook platform等只需要开发者传递内容的平台是最好的选择。
-
无状态,HTTP本身就是无状态的,而使用URL代表资源和使用HTTP method来代表操作动作,本身就没有额外的状态资源占用:
这就有下面这个好处:无状态,所以整个集群可以横向扩展,在遇到资源瓶颈的时候直接加机器就好了
-
超文本驱动:直接在返回的响应之中加入对应的link,比如:
{ "id":1234, "name":"高三一班", "site":“6号楼5层”, "students":[ { "id":10, "name":"小明", "links":[ { "rel":"self", "href":“/api/classes/1234” } ] }, { "id":20, "name":"小红", "links":[ { "rel":"self", "href":“/api/classes/1234” } ] } ], "links":[ { "rel":"self", "href":“/api/classes/1234” }, { "rel":"item", "items":“/api/classes/1234/students” } ] }
直接在相应之中附带上可以用来进行状态转换的动作的URL,那么就可以在不破坏旧的客户端的情况下进行不断的演化,确保系统的演化能力
3. RESTful的缺点
在网络上,的确我们有的时候传输的就是状态而非是资源,那么这个时候RESTful就不起作用了:
比如我们要登录,如果按照RESTful,就得写成新建一个”登陆状态”的资源。如果想要播放一首歌,按照RESTful,也得新增一个”播放状态“的资源。显然这是十分不便的,所以在不能抽象成资源的地方,最好不要使用RESTful。