一、什么是REST?

REST起源

REST是REpresentational State Transfer的首字母缩写,它是1种接口架构的风格。罗伊·菲尔丁(Roy Fielding)于2000年在他的著名论文 Architectural Styles and the Design of Network-based Software Architectures 中首次提出了REST架构风格的概念。

Representational State Transfer 如果按意译可以理解为:构建于 HTTP请求机制之上的一种通用接口技术。

REST与HTTP的关系

REST 不是网络协议,而是利用 HTTP协议实现的一套接口规则。但是REST没有严格定义消息接口名称与数据格式。而是利用 HTTP协议请求类型及消息参数定义。网络层传输的数据格式,采用JSON编码(即序列化),而json也是HTTP头部参数content-type规定的一种。
可以认为 HTTP定义了各种网络功能元素规范及低层通信方式,REST专注于通过组合HTTP定义的各类功能元素来完成其目标:提供统一资源访问接口

REST 安全性是基于HTTP的成熟安全机制,如HTTPS, TLS/SSL, OAuth, JWT token 等。

所以说,REST与 HTTP 是 Hand-in-Hand 手拉手 的关系。这样,REST 就无须再定义一套详细接口标准,开发者也无须再熟悉一套新的接口规范,通过成熟的HTTP开发环境就可以实现REST接口规范的要求。也正是REST这个特点,使其出现后就非常受欢迎,特别是WEB 应用项目。当前前后端分离项目接口几乎都采用了 REST风格。

rest接口python rest接口协议_django

不对比没有感觉,使用过CORBA接口的工程师f都有这样的体会: 接口标准复杂的文档,对参数过于精细的定义,需要很多沟通,开发工具与测试工具的缺乏,新接手的人要熟悉很长一段时间

而 REST 接口,只要理解了REST原理,熟悉http开发,就可以轻松定义接口、编程,无需过多交流,现有丰富的http测试工具与框架来高效率测试。因此,可以预见,REST在未来很长一段时间仍然是使用最广泛的应用层接口技术之一

REST也存在不足之处:传输速度不如采用TCP的接口技术;REST 不支持长连接。因此,通信数据量大,对实时性要求高的场景,建议使用RPC、websocket,MessageQueue等接口技术。

RESTful API

与其他架构风格一样,REST 也有其指导原则和约束。满足 REST 服务接口也称为 RESTful API

符合 REST 体系结构风格的 Web API(或 Web 服务)是 RESTful API。

RESTful API 接口技术的特点

  • 服务器的各类抽象数据都可以被称为资源(resource)
  • 每一个资源都有唯一的资源标识(resource identifier),对资源的操作不会改变这些标识
  • 所有的操作都是无状态的, 即请求-响应结束,连接断开。
  • 通过representation,即资源请求消息,来获取、添加、修改与删除资源.
    一条符合RESTful 的接口消息,称为 Representation,如
    GET: http://i92.168.1.100:8000/employee/1/
  • rest接口python rest接口协议_django_02


二、REST 的指导原则

RESTful API 体系结构的六个指导原则是:

1、统一接口

工作中常遇到两个系统对接时,需要定义接口,如果接口定义的很标准,具有很高的可重用性,能够很方便地应用于类似项目,那这套接口设计往往放进公司标准代码库。在更大范围,软件行业内已经有很多知名的通用接口规范,如基于TCP层协议的SOA,CORBA, gRPC 等接口规范,都是通用的接口规范。REST的统一接口原则也是如此,致力于在HTTP基础上建立一套标准化的接口指导规则(为理解方便,姑且认为它也是一种规范)。

2、客户端-服务器模式

客户端-服务器设计模式实现业务分离,也有利于客户端和服务器组件独立开发。

通过将用户界面问题(客户端)与数据存储问题(服务器)分开,提高了用户界面跨多个平台的可移植性,并通过简化服务器组件来提高可扩展性。

在客户端和服务器不断发展的同时,我们必须确保客户端和服务器之间的接口定义保持向后兼容性。

3、无状态

就客户端每次请求时建立到服务器的连接,收到响应后就断开,不保持长连接,服务器不必跟踪每个客户端的连接状态。

4、可缓存

可缓存约束要求Response结果可以隐式或显式地将标记为可缓存或不可缓存。
如果响应是可缓存的,在有效时间内,服务器可以重用缓存数据,加快处理速度。

5、分层系统

在分层系统中,每个组件都无法看到它们与之交互的直接层之外的内容。

rest接口python rest接口协议_restful_03

6、按需编码

即REST支持客户方便编程,支持跨语言,跨平台,可按需要实现对某个资源的某一项操作,而无须全部。 客户端可以采用java, C++, python, 还可以通过AJAX Javascript 方式很方便扩展客户端功能。

三、实现 RESTful 接口的关键要素

下面列出了实现RESTful接口的关键要素

1. 遵循通用的资源命名方式

采用标准化的资源命令方式,使开发人员容易理解,保持一致:

GET:http://www.test.com/app_name/resource_type/resource_id/
GET:http://www.test.com/version_number/resource_type/resource_id/

如: 某web 服务器上数据库上存在 employee 表,服务器的 URL 为: http://demo.example.com, 则访问员工1001数据的REST接口的URL为: http://demo.example.com/v1/employee/1001/

2. 访问资源方法与请求动词的对应关系

在应用端的资源操作方法,常见的就是数据库CRUD增删改查操作,而请求动词,应用层告知HTTP协议的使用何种方法发送请求,REST的做法是,将CRUD操作与HTTP请求动词建立对应关系。

操作

HTTP请求动词

query all 查询全部数据

GET

query all 查询全部数据

GET

Retrieve查询单条数据

GET ( url要带 id参数)

Create 新增1条数据

POST ( url要带 id参数)

Update 更新1条数据

PUT ( url要带 id参数)

Delete/Destroy 删除1条数据

DELETE ( url要带 id参数)

HTTP PATCH 请求方法用于更新资源部分数据,但通常使用PUT方法,PATCH很少使用,故可忽略。

例如,服务器收到 GET: http://i92.168.1.100:8000/employee/1/ 消息,就知道客户要查询 employee表 id=1 记录的详细数据。 这样REST就借助 HTTP 协议完成了1次查询请求。不需要像 SOA以及gRPC那样,定义一套新的接口规范与序列化规范。因此 REST 接口技术降低了学习成本与开发难度.

rest接口python rest接口协议_rest接口python_04


再如发送1条POST:http://192.168.3.100/employee/, 表示要新增1条记录,内容以Json字节串方式保存在body里。

3. Request Headers 清求头设置

在request header 中可以增加一些附加信息,如 response type, authorization details等。content-type通常设置为 application/json

4. Request Body

使用get, delete请求数据时,通常不需要参数,通常要求推荐鉴权信息。
当增加、修改数据时用post,put请求,相关数据放在body里。

5.Response body

response 把资源数据以json格式放在body里返回给用户

6、Response Status codes 响应状态码

按http response 建议,正确设置响应消息中的状态码,方便客户端据此操作。

四、REST 接口开发框架简介

现在,我们已经了解了,REST 是一套基于HTTP的接口规则,主要用于数据库等资源的远程CRUD操作。选择REST开发框架也就有了1个初步认识:
1) 首先开发框架必须支持HTTP get, post, put, delete 请求接收与响应等处理。
2) 提供方便的资源访问支持,如数据库访问接口
3) 提供 json序列化,反序列化功能

rest接口python rest接口协议_django_05

所以各类语言都可以提供支持上述3点的现成开发框架,如 Java的Sprint Boot, Python 的 django/Flask, C++ REST sdk等,甚至javascript可以实现REST接口服务,如Node.js express 等。

基于上述框架后,开发REST API主要工作是:
(1) 设计 REST API 接口,包括URL路径,url请求参数,返回参数等。
(2) 后端将各类请求消息对应到CRUD操作,提供数据并进行序列化操作,将结果返回给客户端。
(3) 提供API文档页面、测试页面,方便其它开发人员阅读与测试。

设计REST API,可以利用成熟的工具,如 SwaggerUI等,更容易令接口标准化。

REST开发,选择成熟的第3方REST开发框架,能够极大提高开发效率。如 Django REST Framework,内置了Serialization类、通用视图类,只需要 6 条语句实现1条资源的 get, post, put, delete API, 并且提供便捷的测试页面

class CompanyList(generics.ListCreateAPIView):
    queryset = Company.objects.all()
    serializer_class = CompanySerializer


class CompanyDetail(generics.RetrieveUpdateDestroyAPIView):
    queryset = Company.objects.all()
    serializer_class = CompanySerializer

rest接口python rest接口协议_rest接口python_06


具体实现过程,可以参考 Django-Rest-Framework 库实现REST API的实例代码Djiango Rest Framework 还可以自动生成流行的 Swagger API 文档格式。

rest接口python rest接口协议_restful_07