一、什么是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
。
RESTful API 接口技术的特点
- 服务器的各类抽象数据都可以被称为资源(resource)
- 每一个资源都有唯一的资源标识(resource identifier),对资源的操作不会改变这些标识
- 所有的操作都是无状态的, 即请求–响应结束,连接断开。
- 通过representation,即资源请求消息,来获取、添加、修改与删除资源.
一条符合RESTful 的接口消息,称为 Representation,如
GET: http://i92.168.1.100:8000/employee/1/
二、REST 的指导原则
1、统一接口
工作中常遇到两个系统对接时,需要定义接口,如果接口定义的很标准,具有很高的可重用性,能够很方便地应用于类似项目,那这套接口设计往往放进公司标准代码库。在更大范围,软件行业内已经有很多知名的通用接口规范,如基于TCP层协议的SOA,CORBA, gRPC
等接口规范,都是通用的接口规范。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请求动词建立对应关系。
操作 | 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参数) |
例如,服务器收到 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条记录,内容以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序列化,反序列化功能
所以各类语言都可以提供支持上述3点的现成开发框架,如 Java的Sprint Boot, Python 的 django/Flask, C++ REST sdk等,甚至javascript可以实现REST接口服务,如Node.js express 等。
基于上述框架后,开发REST API主要工作是,将各类请求消息对应到CRUD操作,提供数据并进行序列化操作,返回给客户端。
MVC方式的开发步骤通常包括:
REST开发过程中,对每1上模型的处理方式基本上是相同的,写成通用的Serialiaer, Controller 类,能够极大提高开发效率。如 Django的 rest framework 利用通用视图类,只要 6 条语句实现 get, post, put, delete 全部功能,并且提供测试页面
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的实例代码 ,
原文地址:https://blog.csdn.net/captain5339/article/details/129634669
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.7code.cn/show_34732.html
如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除!