Restful需要了解的那些事儿

前言

REST(英文:Representational State Transfer,简称REST,直译过来表现层状态转换)是一种软件架构风格、设计风格,而不是标准,只是提供了一组设计原则和约束条件。它主要用于客户端和服务器交互类的软件。基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制。

REST并没有一个明确的标准,而更像是一种设计的风格,满足这种设计风格的程序或接口我们称之为RESTful(从单词字面来看就是一个形容词)。所以RESTful API 就是满足REST架构风格的接口。

  1. 架构特征

RESTful是一种风格而不是标准,而这个风格大致有以下几个主要特征:

以资源为基础 :资源可以是一个图片、音乐、一个XML格式、HTML格式或者JSON格式等网络上的一个实体,除了一些二进制的资源外普通的文本资源更多以JSON为载体、面向用户的一组数据(通常从数据库中查询而得到)。

统一接口: 对资源的操作包括获取、创建、修改和删除,这些操作正好对应HTTP协议提供的GET、POST、PUT和DELETE方法。换言而知,使用RESTful风格的接口但从接口上你可能只能定位其资源,但是无法知晓它具体进行了什么操作,需要具体了解其发生了什么操作动作要从其HTTP请求方法类型上进行判断。具体的HTTP方法和方法含义如下:

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

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

  • PUT(UPDATE):在服务器更新资源(客户端提供完整资源数据)。

  • PATCH(UPDATE):在服务器更新资源(客户端提供需要修改的资源数据)。

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

从请求的流程来看,RESTful API和传统API大致架构如下:

Restful需要了解的那些事儿_第1张图片

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

无状态:服务器不能保存客户端的信息, 每一次从客户端发送的请求中,要包含所有必须的状态信息,会话信息由客户端保存服务器端根据这些状态信息来处理请求。当客户端可以切换到一个新状态的时候发送请求信息, 当一个或者多个请求被发送之后, 客户端就处于一个状态变迁过程中。每一个应用的状态描述可以被客户端用来初始化下一次的状态变迁。

  1. REST架构限制条件

标准的REST约束应满足以下6个原则:

  • 客户端-服务端(Client-Server): 这个更专注客户端和服务端的分离,服务端独立可更好服务于前端、安卓、IOS等客户端设备。

  • 无状态(Stateless):服务端不保存客户端状态,客户端保存状态信息每次请求携带状态信息。

  • 可缓存性(Cacheability) :服务端需回复是否可以缓存以让客户端甄别是否缓存提高效率。

  • 统一接口(Uniform Interface):通过一定原则设计接口降低耦合,简化系统架构,这是RESTful设计的基本出发点。当然这个内容除了上述特点提到部分具体内容比较多详细了解可以参考这篇REST论文内容。

  • 分层系统(Layered System):客户端无法直接知道连接的到终端还是中间设备,分层允许你灵活的部署服务端项目。

  • 按需代码(Code-On-Demand,可选):按需代码允许我们灵活的发送一些看似特殊的代码给客户端例如JavaScript代码。

3.RESTful API设计规范

URL设计规范

URL为统一资源定位器 ,接口属于服务端资源,首先要通过URL这个定位到资源才能去访问,而通常一个完整的URL组成由以下几个部分构成:

URI = scheme "://" host  ":"  port "/" path [ "?" query ][ "#" fragment ] 1.

scheme: 指底层用的协议,如http、https、ftp

host: 服务器的IP地址或者域名

port: 端口,http默认为80端口

path: 访问资源的路径,就是各种web 框架中定义的route路由

query: 查询字符串,为发送给服务器的参数,在这里更多发送数据分页、排序等参数。

fragment: 锚点,定位到页面的资源

我们在设计API时URL的path是需要认真考虑的,而RESTful对path的设计做了一些规范,通常一个RESTful API的path组成如下:

/{version}/{resources}/{resource_id} 1.

version:API版本号,有些版本号放置在头信息中也可以,通过控制版本号有利于应用迭代。

resources:资源,RESTful API推荐用小写英文单词的复数形式。

resource_id:资源的id,访问或操作该资源。

当然,有时候可能资源级别较大,其下还可细分很多子资源也可以灵活设计URL的path,例如:

/{version}/{resources}/{resource_id}/{subresources}/{subresource_id} 1.

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

/{version}/{resources}/{resource_id}/action 1.

其中action就是对资源的操作。

从大体样式了解URL路径组成之后,对于RESTful API的URL具体设计的规范如下:

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

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

  1. 正确使用 "/"表示层级关系,URL的层级不要过深,并且越靠前的层级应该相对越稳定

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

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

  1. 资源表示用复数不要用单数

  1. 不要使用文件扩展名


在RESTful API中,不同的HTTP请求方法有各自的含义,这里就展示GET,POST,PUT,DELETE几种请求API的设计与含义分析。针对不同操作,具体的含义如下:

GET /collection:从服务器查询资源的列表(数组) 
GET /collection/resource:从服务器查询单个资源  
POST /collection:在服务器创建新的资源  
PUT /collection/resource:更新服务器资源  
DELETE /collection/resource:从服务器删除资源 

你可能感兴趣的:(java基础,restful,后端,java)