RESTful风格的接口

RESTful API

1、什么是RESTful API?

RESTful API通常根据 GET/POST/PUT/DELETE 来区分操作资源的动作,是一种风格,而不是一种约束和规约。

REST并没有一个明确的标准,更像是一种设计的风格,满足这种风格的程序接口称之为RESTful API


2、RESTful风格的主要特征

2.1 以资源为基础

资源可以是一个图片、音乐、HTML或JSON格式等网络上的一个实体,面向用户的一组数据等等...


2.2 统一接口

使用RESTful风格的接口,从接口上你可能只能定位其资源,但无法知晓它进行了什么操作,需要从GET/POST/PUT/DELETE等请求方法类型上进行判断。

  • GET(SELECT):从服务器取出资源(一项或多项)
  • POST(CREATE):在服务器新建一个资源
  • PUT(UPDATE):在服务器更新资源(客户端提供完整资源数据)
  • PATCH(UPDATE):在服务器更新资源(客户端提供需要修改的资源数据)
  • DELETE(DELETE):从服务器删除资源

2.3 URI指向资源

URI(统一资源标志符),用来标识抽象或物理资源的一个紧凑的字符串。RUI包括URL和URN,在更多时候可能代指RUL。RESTful是面向资源的,每种资源可能由一个或多个URI对应,但一个URI只指向一种资源。


2.4 无状态

服务器不能保存客户端的信息, 每一次从客户端发送的请求中,要包含所有必须的状态信息,会话信息由客户端保存, 服务器端根据这些状态信息来处理请求。

当客户端可以切换到一个新状态的时候发送请求信息, 当一个或者多个请求被发送之后, 客户端就处于一个状态变迁过程中。 每一个应用的状态描述可以被客户端用来初始化下一次的状态变迁。


3、RESTful API设计规范

3.1 URL设计规范

通常一个RESTful API的path组成如下:

/{version}/{resources}/{resource_id}

  • version:API版本号,有些版本号放置在头信息中也可以,通过控制版本号有利于应用迭代。
  • resources:资源,RESTful API推荐用小写英文单词的复数形式。
  • resource_id:资源的id,访问或操作该资源。

此外,有时可能增删改查无法满足业务要求,可以在URL末尾加上action

/{version}/{resources}/{resource_id}/action

RESTful API的URL具体设计的规范如下:

  • 1.不用大写字母,所有单词使用英文且小写

  • 2.连字符用中杠"-"而不用下杠"_"

  • 3.结尾不要包含正斜杠分隔符"/"

  • 4.URL中不出现动词,用请求方式表示动作

  • 5.资源表示用复数不要用单数

  • 6.不要使用文件扩展名


3.2 HTTP动词

以下展示GET,POST,PUT,DELETE几种请求API的设计与含义分析。

在谈及GET,POST,PUT,DELETE的时候,就必须提一下接口的安全性幂等性

其中安全性是指方法不会修改资源状态,即读的为安全的,写的操作为非安全的。

幂等性的意思是操作一次和操作多次的最终效果相同,客户端重复调用也只返回同一个结果。

上述四个HTTP请求方法的安全性和幂等性如下:

HTTP Methods 安全性 幂等性 解释
GET 安全 幂等 读操作安全、不管查询一次,还是查询多次,结果都相同
POST 非安全 非幂等 写操作不安全、插入一次和插入多次,结果并不相同,数据量增多
PUT 非安全 幂等 写操作不安全、更新一次和更新多次,结果相同
DELETE 非安全 幂等 写操作不安全、删除一次和删除多次,结果相同

3.3 状态码和返回数据

服务器响应时,包含状态码和返回数据两个部分:

状态码

主要分为五大类:

  • 1xx:相关信息
  • 2xx:操作成功
  • 3xx:重定向
  • 4xx:客户端错误
  • 5xx:服务器错误

主要常用状态码罗列在下面:

  • 200 OK - [GET]:服务器成功返回用户请求的数据,该操作是幂等的。
  • 201 CREATED - [POST/PUT/PATCH]:用户新建或修改数据成功。
  • 202 Accepted - [*]:表示一个请求已经进入后台排队(异步任务)。
  • 204 NO CONT202 Accepted - [*]:ENT - [DELETE]:用户删除数据成功。
  • 400 INVALID REQUEST - [POST/PUT/PATCH]:用户发出的请求有错误,服务器没有进行新建或修改数据的操作,该操作是幂等的。
  • 401 Unauthorized - [*]:表示用户没有权限(令牌、用户名、密码错误)。
  • 403 Forbidden - [*]:表示用户得到授权(与401错误相对),但是访问是被禁止的。
  • 404 NOT FOUND - [*]:用户发出的请求针对的是不存在的记录,服务器没有进行操作,该操作是幂等的。
  • 406 Not Acceptable - [GET]:用户请求的格式不可得(比如用户请求JSON格式,但是只有XML格式)。
  • 410 Gone -[GET]:用户请求的资源被永久删除,且不会再得到的。
  • 422 Unprocesable entity - [POST/PUT/PATCH] 当创建一个对象时,发生一个验证错误。
  • 500 INTERNAL SERVER ERROR - [*]:服务器发生错误,用户将无法判断发出的请求是否成功。

返回数据

针对不同操作,服务器向用户返回数据,而各个团队或公司封装的返回实体类也不同,但都返回JSON格式数据给客户端。


4、RESTful的缺点

RESTful风格的API 固然很好很规范,但大多数互联网公司并没有按照或者完全按照其规则来设计,因为REST是一种风格,而不是一种约束或规则,过于理想的RESTful API 会付出太多的成本。

比如RESTful API也有一些缺点

  • 比如操作方式繁琐,RESTful API通常根据GET、POST、PUT、DELETE 来区分操作资源的动作,而HTTP Method 本身不可直接见,是隐藏的,而如果将动作放到URL的path上反而清晰可见,更利于团队的理解和交流。
  • 有些浏览器对GET,POST之外的请求支持不太友好,还需要特殊额外的处理。
  • 过分强调资源,而实际业务API可能有各种需求比较复杂,单单使用资源的增删改查可能并不能有效满足使用需求,强行使用RESTful风格API只会增加开发难度和成本。

如果业务需求和RESTful风格API不太匹配或者很麻烦,那也可以不用RESTful风格API。

无论那种风格的API都是为了方便团队开发、协商以及管理,不能墨守成规。

posted @ 2022-08-12 10:04  笔下洛璃  阅读(1823)  评论(0编辑  收藏  举报