REST接口的基本原理介绍
一、什么是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风格。
不对比没有感觉,使用过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 的指导原则
RESTful API 体系结构的六个指导原则是:
1、统一接口
工作中常遇到两个系统对接时,需要定义接口,如果接口定义的很标准,能够很方便地重用于类似项目。基于此目的,软件行业内,定义了已经很多通用接口规范,如SOA,CORBA, RPC
等接口规范,都是通用的接口规范。REST的统一接口原则也是致力于在HTTP
基础上建立一套标准化的接口指导规则(为理解方便,姑且认为它也是一种规范)。
2、客户端-服务器模式
客户端-服务器设计模式实现业务分离,也有利于客户端和服务器组件独立开发。
3、无状态
就客户端每次请求时建立到服务器的连接,收到响应后就断开,不保持长连接,服务器不必跟踪每个客户端的连接状态。
4、可缓存
可缓存约束要求Response结果可以隐式或显式地将标记为可缓存或不可缓存。
如果响应是可缓存的,在有效时间内,服务器可以重用缓存数据,加快处理速度。
5、分层系统
在分层系统中,每个组件都无法看到它们与之交互的直接层之外的内容。
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请求动词建立对应关系。
下面列出了最常用的5种REST API 对应关系: 2条显示类API, 3条编辑类API
操作 | HTTP请求动词 |
---|---|
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 接口技术降低了学习成本与开发难度.
再如: 发送1条POST:http://192.168.3.100/employee/
, 表示要新增1条记录。
3. Request Headers 清求头设置
在request header 中可以增加一些附加信息,如 response type, authorization details
等。content-type
通常设置为 application/json
4. Request Body
使用get, delete请求数据时,通常不需要参数,查询单条记录,用url路径参数即可,如前面示例中的 GET: http://i92.168.1.100:8000/employee/1/
, url path为 /employee/<id: int>
.
当增加、修改数据时, 相关数据放在 post,put请求参数中。
鉴权参数通常保存在Authorization 头部参数,或者cookies中。
5.Response body
response 把资源数据以json格式放在body里返回给用户
6、Response Status codes 响应状态码
按http response 建议,正确设置响应消息中的状态码,方便客户端据此操作。
四、Django-REST-Framework 开发框架介绍
现在,我们已经了解了,REST 是一套基于HTTP的接口规则,主要用于数据库等资源的远程CRUD操作。选择REST开发框架也就有了1个初步认识:
1) 首先开发框架必须支持HTTP get, post, put, delete 请求接收与响应等处理。
2) 提供方便的资源访问支持,如数据库访问接口
3) 提供 json序列化,反序列化功能
1、使用流行的 REST 开发框架
所以各类语言都可以提供支持上述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等。
2、Django-REST-Framework 框架的优点
REST开发,选择成熟的第3方REST开发框架,能够极大提高开发效率。如 Django REST Framework,内置了Serialization类、通用视图类,具有许多其它框架没有的优点:
1) 代码简洁、效率高
比如,只需要 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
具体实现过程,可以参考 Django-Rest-Framework 库实现REST API的实例代码
2)自动生成标准格式的 API 文档页面
Djiango Rest Framework 可以自动生成流行的 Swagger API 文档格式,DRF内置API Document 格式,均支持API 文档、检索、测试等。
3) Django 本身提供了完善的用户认证、权限管理模块
Django 内置Auth模块提供了基本鉴权、普通 token,JWT token等用户认证功能,也可通过第3方模块实现OAuth认证。
内置的Auth还提供了全面的API 级别、模型级、行级数据的权限控制功能,也可集成第3方库实现字段级的权限控制。
对商业项目来说,鉴权与权限管理功能,是至关重要的基础功能,对于 Django-REST-Framework 来说,这是一项轻而易举的功能。
4) Django内置ORM功能
由于内置了ORM功能,迁移数据库是一项较为容易的工作。 对于项目未来的扩展,这是一项需要认真考虑的条件。
3、Django 内置了自动化测试功能
Django 内置了自动化测试功能,提供了unittest 测试类,还提供了1个模拟客户端。测试动态页面。还可以便引入 selenium, playwright 等库来测试。
DRF内置 API Document 模块还可自动生成测试代码:
Python是编写自动化测试代码效率最高的语言,没有之一。 DRF项目的API测试应该采用自动化测试,不但开发效率高,还可以有效节省测试成本。
4、DRF与其它框架相比
与Flask-RESTful 相比
Flask开发REST API 接口本身非常便捷,部署也更容易。但对于商业项目、比较大的项目来说,是否能提供页面测试功能、标准API文档、完善的鉴权与权限管理等功能是必不可少的需求,而实现这些功能,对于Flask 太麻烦了。
对于开发商业前后端分离项目来说,相比Flask-RESTful, 选择Django-REST-Framework来开发REST API 是正确的选择。除非不需要前面提到的功能,Flask-RESTful 也是不错的选择。
与Spring Boot 相比
前面提到的功能,Spring Boot 实现起来,也需要导入第3方依赖,做很多配置与开发才能实现,特别是行级、字段级权限管理。在开发效率上远不及Django, 当然Spring Boot 的优点是运行速度快一些。 此外,高水平django开发人员远不及Spring Boot多,所以项目预算充足,时间不紧,Spring Boot 是比较好的选择。 但对于小公司,Django-REST-Framework 是更好选择。
与 node.js express相比
Node.js 生态圈近几年发展迅速,express 开发效率也很高。 适合于纯数据库CRUD的项目,或用于替代php,项目的开发人员也容易同时上手前后端开发。但开发鉴权、权限管理、自动化测试代码,效率还是明显不如 Django。如果项目还需要对数据进行各种清洗、处理,还需要与访问其它系统,如硬件、TCP/UDP、图像处理等,这种情况下,应该毫无疑问,django 才能胜任。
与 C++ REST SDK 相比
通常 C++程序的运行速度是最快的,大部分项目并不需要这种优势,除非项目需求中,要求支持很高的API 访问量,对成本还有限制,否则不推荐采用 C++ REST SDK 来开发。多放几台服务器的硬件成本肯定比养C++程序员的成本低。
更多推荐
所有评论(0)