程序员

Restful 概述与开发规范

2018-12-02  本文已影响0人  Damo很努力

一 什么是Restful?

          随着互联网的发展,前端设备层出不穷(手机、平板、桌面电脑、其他专用设备......),这些(客户端)设备都需要访问后端进行通信,因此,必须有一种统一的机制,方便不同的前端设备与后端进行通信,于是RESTful诞生了,它可以通过一套统一的接口为 Web,iOS和Android提供服务

二  Restful 设计规范

1.协议

        API与用户的通信协议,总是使用https协议。

2.域名

       应该尽量将API部署在专用域名之下,例如:https://api.example.com,如果确定API很简单,不会有进一步扩展,可以考虑放在主域名:https://example.com/api

3.路径(Endpoint)

路径又称"终点"(endpoint),表示API的具体网址。

        在RESTful架构中,每个网址代表一种资源(resource),所以网址中不能有动词,只能有名词,而且所用的名词往往与数据库的表格名对应。一般来说,数据库中的表都是同种记录的"集合"(collection),所以API中的名词也应该使用复数。

       举例来说,有一个API提供动物园(zoo)的信息,还包括各种动物和雇员的信息,则它的路径应该设计成下面这样。

https://api.example.com/zoos

https://api.example.com/animals

https://api.example.com/employees

4.常用动词

GET(SELECT):从服务器取出资源(一项或多项)。

POST(CREATE):在服务器新建一个资源。

PUT(UPDATE):在服务器更新资源(客户端提供改变后的完整资源)。

PATCH(UPDATE):在服务器更新资源(客户端提供改变的属性)。

DELETE(DELETE):从服务器删除资源。 

5.过滤信息(Filtering)

如果记录数量很多,服务器不可能都将它们返回给用户。API应该提供参数,过滤返回结果。

      下面是一些常见的参数。

        ?limit=10:指定返回记录的数量

        ?offset=10:指定返回记录的开始位置。

        ?page=2&per_page=100:指定第几页,以及每页的记录数。

        ?sortby=name&order=asc:指定返回结果按照哪个属性排序,以及排序顺序。

        ?animal_type_id=1:指定筛选条件

6.宾语必须是名词

宾语就是 API 的 URL,是 HTTP 动词作用的对象。它应该是名词,不能是动词。比如,/articles这个 URL 就是正确的,而下面的 URL 不是名词,所以都是错误的。

/getAllCars

/createNewCar

/deleteAllRedCars

而应该是:

GET/cars:查询所有车辆

GET/cars/ID:查询指定的的车辆

POST/cars:创建辆车辆

DELETE/cars:删除一辆车辆

PUT/cars/ID 更新一辆车辆

7.复数URL

既然 URL 是名词,那么应该使用复数,还是单数?这没有统一的规定,但是常见的操作是读取一个集合,比如GET/cars(获取所有车辆),这里明显应该是复数。

为了统一起见,建议都使用复数 URL,比如GET/cars/2 要好于GET/car/2。

8.避免多级 URL

         比如我要查询所有某个作者文章中的某一类文章,错误的URL写法是:

        GET/authors/12/categories/2

         如果我的分级很多,这样的url往往要多看一会儿,才能懂。

         正确的做法应该是除了第一级,其他级别都用查询字符串表达:

         GET/authors/12?categories=2

9.状态码

状态码应该自定义一套让客户端看得懂的状态码,例如:

1xx:相关信息

2xx:操作成功

3xx:重定向

4xx:客户端错误

5xx:服务器错误

五大类总共包含100多种状态码,覆盖了绝大部分可能遇到的情况。每一种状态码都有标准的(或者约定的)解释,客户端只需查看状态码,就可以判断出发生了什么情况,所以服务器应该返回尽可能精确的状态码。

10.请求/返回格式

           请求/返回格式应该为统一的JSON格式封装,并且有统一的格式

例如返回格式:

            Result {

"code":200,

"msg":"操作成功",

                 "data":{

                          "id":111,

"name":"我是返回内容"

}

            } 

上一篇下一篇

猜你喜欢

热点阅读