RESTful初探

简介,优点和缺点

Posted by Haiming on May 28, 2020

本文主要解决三个问题:

  1. 什么是RESTful?
  2. RESTful的优点是什么?
  3. 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的优点

  1. 可以服务多种Client,比如Web,IOS和Android。另外对于不需要前端或者个人无法开发的前端,比如微博开放平台,Facebook platform等只需要开发者传递内容的平台是最好的选择。

  2. 无状态,HTTP本身就是无状态的,而使用URL代表资源和使用HTTP method来代表操作动作,本身就没有额外的状态资源占用:

    这就有下面这个好处:无状态,所以整个集群可以横向扩展,在遇到资源瓶颈的时候直接加机器就好了

  3. 超文本驱动:直接在返回的响应之中加入对应的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。