From 9511c9d8ac426db9253df344abfbe5e607ad5d13 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E9=9B=AA=E8=8A=B3=EF=BC=88Charlie=EF=BC=89?= <2332958287@qq.com> Date: Fri, 17 May 2024 22:27:22 +0800 Subject: [PATCH] =?UTF-8?q?REST=E7=AE=80=E4=BB=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../20240514_REST\347\256\200\344\273\213.md" | 98 +++++++++++++++++++ 1 file changed, 98 insertions(+) create mode 100644 "\351\273\204\351\233\252\350\212\263/20240514_REST\347\256\200\344\273\213.md" diff --git "a/\351\273\204\351\233\252\350\212\263/20240514_REST\347\256\200\344\273\213.md" "b/\351\273\204\351\233\252\350\212\263/20240514_REST\347\256\200\344\273\213.md" new file mode 100644 index 0000000..3e592dc --- /dev/null +++ "b/\351\273\204\351\233\252\350\212\263/20240514_REST\347\256\200\344\273\213.md" @@ -0,0 +1,98 @@ +### 一、API与REST +#### 1.什么是API +- 应用程序接口(API,Application Programming Interface)是基于编程语言构建的结构,使开发人员更容易地创建复杂的功能。它们抽象了复杂的代码,并提供一些简单的接口规则直接使用 +- Web API作为一个Web应用程序,向外提供一些可以对数据进行操作的接口 +- Web API能够实现不同应用程序之间的访问,它与操作平台或编程语言无关,仅仅只是为外部应用程序提供了抽象,而不是在内部实现 +#### 2.什么是REST +##### 1.概念 +- REST是一种软件构架风格,是一种规定了如何发送和接收数据的方式 +- REST的核心理念就是将资源(例如文本、图片、音频等等)以统一的接口进行管理,这些资源可以通过URL进行访问,并使用标准的HTTP方法进行操作 +- REST和HTTP有一定的关系,资源在服务的提供方和请求方之间进行传递,,需要借助协议来约,而HTTP协议完全可以满足REST中所定义的约束 +##### 2.REST约束 +1. 客户端-服务器:体现关注点分离(类似前后端分离),客户端负责用户界面和用户行为,服务器负责数据存储和处理 + - 拓展——微服务:微服务是一种软件架构风格,其中应用程序被构建为一组小型、独立的服务,每个服务专注于执行特定的业务功能。这些服务可以通过轻量级通信机制(如HTTP RESTful API)进行通信,并可以通过自动化工具进行部署 +2. 统一接口:系统中的组件之间的通信必须是通过统一的接口进行的,统一接口约束本身由4个子约束组成: + - 资源的标识:任何能够命名的对象都是一个资源,统一资源标识符通常是一个URL(统一资源定位符)。每个URL代表一个资源或资源集合,访问对于URL就可以对该资源执行操作 + - 通过表述操作资源:当请求一个资源时,服务器会返回该资源的一个表述(表示资源当前的状态),它由表述正文和表述元数据组成,格式通常为JSON、XML和HTML等,所以可以访问指定表述格式的资源,或者访问一个资源的不同格式不需要修改资源的标识符 + - 自描述消息:客户端和服务器之间传递的每一条消息包含了资源表述、资源表述的相关信息(如资源表述的格式、内容长度等)、资源相关的其他操作信息 + - 超媒体作为应用程序状态引擎:客户端可以根据服务端提供的超链接来动态地构建和驱动应用程序的状态转换 +3. 分层系统:要求客户端无法直接访问服务器上的资源,而是通过中间层(如代理服务器或负载均衡器)来间接访问。这意味着客户端和服务器之间存在多个层级,每个层级对于另一个层级来说都是透明的 +4. 缓存:服务器必须标识哪些响应是可缓存的,并在响应中提供缓存控制信息。客户端可以使用缓存来减少对服务器的请求,提高性能和减少网络流量 +5. 无状态:每个请求都必须包含所有必要的信息,服务器不会保存关于客户端状态的任何信息。这使得系统更容易扩展,因为服务器不需要维护每个客户端的状态 +6. 按需编码:服务器可以通过将代码传输到客户端来扩展客户端的功能,但是这应该是可选的,并且由客户端控制 +##### 3.对REST的误区 +1. 只有遵守了REST约束的API才叫【RESTful API】 +2. 除了REST之外,另一种常见的API风格是RPC风格(远程过程调用),用于在不同的计算机之间进行通信和调用远程服务。 +3. REST风格和RPC风格的区别: + - REST面向资源(通常指服务器),PRC面向功能(函数) + - REST的端点是名词、资源、资源集合,PRC的端点是动词、方法名 + - REST对资源执行操作,RPC执行服务器上的方法 + - REST返回请求的资源,RPC返回调用方法的执行结果 + +### 二、HTTP协议 +#### 1.简介 +见以往笔记 +#### 2.统一资源定位符(URL) +##### 1.URL组成部分 +1. http://(URL协议):除http://外,常见的协议还有https://(加密)、ftp://(文本传输协议)、mailto://(电子邮件协议)等等 +2. www.***.com(主机名,也可以叫域名) +3. /user/1(URL路径):具体指向服务器上的具体资源 +4. 端口号:在主机名后面,以:隔开。HTTP协议默认使用80端口号 +5. 查询字符串:URL问号后面的参数部分,参数名和参数用=分隔,多个参数用&分隔 +6. 锚部分(片段Frament):在#后面的内容,用于指明一个资源的特定位置 +一个完整的URL形式如下所示 +~~~apl +://[:port]/[path][?query][#fragment] + {/* []是可省略部分,<>不可省略 */} +~~~ +##### 2.URL和URI的区别 +URL是URI的子集,一个URL就是一个URI +#### 3.媒体类型 +##### 1.概念 +当HTTP服务器返回响应时,不但返回资源本身,也会在响应中指明资源的内容类型,就叫做媒体类型。HTTP依赖于MIME标准,媒体类型也叫MIME类型。浏览器通过MIME类型决定如何处理文档,只有设置正确的MIME类型,才会被识别 +##### 2.常见的MIME类型 +1. text/plain:纯文本 +2. text/html:HTML内容 +3. image/jpeg/png:表示JPEG/png图片 +4. application/json:表示JSON格式的数据 +#### 4.HTTP消息 +是服务器和客户端之间交换数据的方式,有两种类型:请求消息和响应消息。两种消息都包括以下四个部分的内容: +- 起始行:用于描述要执行的请求、对应的状态,包括以下3项 + 1. HTTP方法 + - GET:获取资源,但是是不会修改资源,是安全方法(指不会修改资源),而且是幂等方法(多次调用效果总是一样的) + - POST:创建资源,会修改服务器上的资源,不是安全方法,也不是幂等方法 + - PUT:更新资源,会修图该资源,不是安全方法,却是幂等方法;另外当资源不存在,可以实现创建资源 + - DELETE:删除资源,不是安全方法,却是幂等方法 + - PATCH:对资源进行部分更新(例如部分字段或属性),不是安全方法,也不是幂等方法 + - HEAD:与GRT相同,但是不返回消息正文,通常用于检测资源是否存在以及获取资源的元数据 + - OPTIONS:获取资源支持的操作 + 2. 请求目标:通常是一个URL,表示所要访问的资源 + 3. HTTP版本:目前是HTTP/1.1 +- HTTP消息头:描述请求或响应的相关属性、配置、对消息正文的描述等等,具体见课本P10 +- 空行:指明消息头已经发送完毕 +- 消息正文:包含请求数据或响应中资源的表述,这一部分可以为空 +其中HTTP响应的起始行与请求有些不同,包含以下3项: +1. 协议版本:目前是HTTP/1.1 +2. 状态码:表明请求是否成功,主要分为以下5类:(具体看课本P12) + - 1xx:信息,收到请求,需要请求方继续执行操作 + - 2xx:成功执行请求操作 + - 3xx:重定向,需要进一步操作完成请求 + - 4xx:客户端错误,请求包含语法错误或请求内容不正确 + - 5xx:服务端错误,服务端在处理请求的过程中发生错误 + +### 三、设计资源的URL注意原则 +1. 使用名词的复数形式表示资源集合,如localhost:3000/books +2. 使用斜线/表示资源之间的层次关系,如/books/1——表示Id为1的图书信息 +3. 对资源的增删改查操作名称不能包含在URL中 +4. 如果一个操作无法对应到资源的某个操作上,可以适当地在URL中包含动词,如:【PUT /books/12/set-admin】 +5. 查询字符串可以对资源进行筛选、搜索或分页查询,如【GET /books?Id=12&pageNumber=2】 +6. URL使用小写字母 +7. 避免使用下划线_,用中划线—代替 +8. URL末尾不应该包含斜线/,不但没有意义还会造成歧义 + +### 四、API版本 +当API发生了变化(比如资源表述内容新增或系统添加新资源类型等等),应该使用不同的版本来区别对API的更改,RESTAPI添加版本用以下4种方式: +1. 使用URL路径,比较常用,如localhost:3000/v1/books +2. 使用查询字符串,如/books?version=v1 +3. 使用自定义消息头,如Accept-version:v1 +4. 使用Accept消息头,如Accept:application/json;v=2.0 \ No newline at end of file -- Gitee