一、什么是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头部参数contenttype规定的一种。
可以认为 HTTP定义了各种网络功能元素规范及低层通信方式REST专注于通过组合HTTP定义的各类功能元素完成其目标:提供统一资源访问接口

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

所以说,REST与 HTTP 是 Handin-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 接口技术的特点

二、REST 的指导原则

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

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参数

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

例如,服务器收到 GET: http://i92.168.1.100:8000/employee/1/ 消息,就知道客户要查询 employeeid=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, Pythondjango/Flask, C++ REST sdk等,甚至javascript可以实现REST接口服务,如Node.js express 等。

基于上述框架后,开发REST API主要工作是,将各类请求消息对应到CRUD操作,提供数据并进行序列化操作,返回给客户端。

MVC方式的开发步骤通常包括:

REST开发过程中,对每1上模型处理方式基本上是相同的,写成通用的Serialiaer, Controller 类,能够极大提高开发效率。如 Djangorest 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进行投诉反馈,一经查实,立即删除!

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注