REST API的基础:HTTP

news2024/9/25 9:41:11

在本文中,我们将深入探讨万维网数据通信的基础 - HTTP。

什么是超文本?

HTTP(超文本传输协议)的命名源于“超文本”。

那么,什么是超文本?

想象一下由超链接组成的文本、图像和视频的混合物。这些链接充当我们从一个超文本集合跳转到另一个集合的门户。HTML(超文本标记语言)就是超文本的一个典型示例。

HTML是一个纯文本文件。它包含许多标签,这些标签定义了到图像、视频等的链接。浏览器解释这些标签后,将看似普通的文本文件转换为充满文本和图像的网页。

HTTP/1.1、HTTP/2和HTTP/3

自从1989年诞生HTTP 0.9以来,HTTP经历了重大变革。让我们回顾一下每个HTTP版本解决的问题。下图展示了关键的改进。

•HTTP/1.0在1996年最终定稿并正式记录下来。该版本有一个重要限制:对同一服务器的每个请求都需要单独的TCP连接。•HTTP/1.1在1997年推出。它引入了“持久连接”的概念,意味着可以保持TCP连接以进行重用。尽管有这一改进,HTTP/1.1无法解决“HOL(Head-of-Line)阻塞”问题。简而言之,当浏览器的所有并行请求槽都被占满时,后续请求必须等待前面的请求完成,这就是HOL阻塞。•HTTP/2.0于2015年发布,旨在解决HOL阻塞问题。它实现了“请求多路复用”(request multiplexing)的策略,以消除应用层的HOL阻塞。如下图所示,HTTP/2.0引入了HTTP“流”的概念。这种抽象允许将不同的HTTP交换复用到同一TCP连接中,无需按顺序发送每个流。但是,HOL阻塞仍可能发生在传输(TCP)层。•HTTP/3.0于2020年发布了一份草案,作为HTTP/2.0的继任者,它将TCP替换为QUIC作为底层传输协议。这有效地消除了传输层的HOL阻塞。QUIC基于UDP。它在传输层引入了流作为一级公民。QUIC流共享相同的QUIC连接,无需额外的握手或慢启动来创建新的流。QUIC流可以独立传输。这意味着在大多数情况下,一个流中的数据包丢失不会影响其他流。

a86d0c0c43fe3d8fd3deed9194e0ebe7.png

HTTP头部

HTTP头部在客户端和服务器之间发送和接收数据时起着关键作用。它们为这些实体提供了一种结构化的方式来传递有关请求或响应的重要元数据。这些元数据可以包含各种信息,例如发送的数据类型、长度、压缩方式等。

HTTP头部由多个字段组成,每个字段具有特定的作用和含义。现在我们对HTTP头部有了一定的了解,让我们深入探讨一些特定的HTTP字段。

HTTP字段

当我们向服务器发送HTTP请求时,有一些常见的字段起着至关重要的作用。让我们逐个剖析一些字段。

•Host:这是服务器的域名。•Content-Length:请求或响应头部中的这个字段在数据传输中起着至关重要的作用。它明确地指示请求或响应主体的大小(以字节为单位)。这有助于接收方理解当前消息何时结束,并可能为下一个消息做准备,特别是在多个HTTP消息通过同一连接发送的情况下。•Connection:该字段在HTTP持久连接中至关重要,其中一个TCP连接用于发送和接收多个HTTP请求和响应。我们将详细讨论这个。•Content-type:该字段告诉客户端接收到的数据的格式。•Content-encoding:该字段指示用于数据的压缩格式。例如,如果客户端看到'gzip'编码,它知道需要解压缩数据。

4167ad4d26349baa5e2901f81ad32365.png

HTTP GET与HTTP POST

HTTP协议定义了各种方法或“动词”来对Web资源执行不同的操作。常用的方法包括GET、POST、PUT和DELETE,通常用于读取、创建、更新和删除资源。较少使用的方法包括HEAD、CONNECT、OPTIONS、TRACE和PATCH,我们在之前的“API设计”问题中已经介绍过。

一个常见的面试问题是:“GET和POST有什么区别?”让我们深入了解它们的定义。

HTTP GET:该方法通过URL从服务器检索资源,不会产生其他影响。由于GET请求通常没有有效载荷主体,因此可以对网页进行书签、共享和缓存。

HTTP POST:该方法基于有效载荷主体与资源进行交互。交互方式因资源类型而异。例如,如果我们在购买了一台 iPhone 14 后留下了一条评论,并单击“提交”,将发送带有评论的POST请求到服务器。虽然HTTP协议本身对POST请求的消息主体大小没有定义限制,但实际上,浏览器和服务器通常会施加自己的限制。

理解GET和POST的特性

HTTP方法具有一些属性,定义了它们与服务器资源交互的方式。其中两个属性是它们是否“非变异”和“幂等”。

非变异方法不会改变任何服务器资源。相反,幂等方法无论重复多少次,都会产生相同的结果。

HTTP GET:GET方法检索数据而不会引起更改,因此是非变异的。此外,重复GET请求不会改变结果,因此是幂等的。

HTTP POST:与GET不同,POST方法发送的数据可以修改服务器资源,因此可能是可变异的。此外,如果我们重复POST请求,它可能会创建额外的资源,因此是非幂等的。

然而,重要的是要注意,实际行为可能取决于服务器如何实现这些方法。虽然标准建议特定行为,但开发人员有时会以非标准的方式使用这些方法。例如,GET方法可能用于删除数据(使其既可变异又非幂等),或者POST方法可能用于检索数据(使其非变异和潜在幂等)。

有一个臭名昭著的例子是一个博客作者使用GET来执行帖子删除操作,假设没有人会访问该博客。但是当Google抓取该博客时,所有帖子都被删除了!

此外,值得注意的是,无论是GET还是POST,它们本身并不安全,无法防止信息泄露。GET参数在URL中可见,而POST主体虽然在URL中不可见,但如果没有加密仍然可以被拦截。为了确保安全的数据传输,建议使用HTTPS,这是我们将在后面更详细地讨论的一个主题。

HTTP Keep-Alive与TCP keepalive

我们已经讨论过HTTP如何使用“Connection: Keep-Alive”来启动持久连接。还记得在TCP问题中提到的TCP keepalive机制吗?它们是否相同?不,它们完全不同:

•HTTP Keep-Alive与HTTP持久连接相关,它在应用层运行。•TCP keepalive在传输层工作,在数据交换空闲期间保持TCP连接活动。

让我们深入了解。

HTTP Keep-Alive

除了HTTP/3以外,HTTP都构建在TCP之上。建立HTTP连接需要进行3次TCP握手。在发送HTTP请求并接收到响应后,TCP连接断开。

以这种方式向同一服务器发送多个请求非常低效。重用相同的TCP连接是否更好?这就是HTTP Keep-Alive的目的。它保持TCP连接,直到任一方请求断开连接。

HTTP/1.1默认启用了HTTP Keep-Alive。

HTTP Keep-Alive减少了打开和关闭TCP连接的开销。当与HTTP/2结合使用时,效果更好。HTTP/2引入了“流”的概念。

流允许我们同时发送多个请求,而无需等待服务器的响应。更重要的是,这些请求和响应可以按照任意顺序处理,这在仅使用HTTP Keep-Alive时是不可能的。

下面的对比图显示了HTTP Keep-Alive和HTTP/2流之间的区别。通常,我们等待第一个响应返回后才发送第二个请求。但是使用HTTP/2流,我们可以同时发送多个请求,而无需等待第一个响应,服务器可以按任意顺序响应。

为什么这很重要?这个特性对于避免“HOL(Head-of-Line)阻塞”非常关键。在HTTP的早期版本中,如果服务器处理一个请求的时间很长,后续的请求必须等待,导致延迟。但是使用HTTP/2流,每个请求是独立的。即使服务器处理一个请求的时间较长,它仍然可以响应其他请求。响应可以在准备就绪时立即返回,即使这意味着它们的顺序与原始请求不同。

e7d676241b192df9594bce1c9e79bab0.png

TCP keepalive

TCP keepalive与HTTP Keep-Alive无关。在TCP连接中,双方保持在已建立状态,直到一方结束连接。如果一方不通知另一方而断开连接,剩余的一方将不知道。TCP keepalive通过在没有数据交换时定期发送探测来解决这个问题。我们在之前的TCP问题中讨论过。下面的图表应该对此有所复习。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/810096.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Nacos的搭建及服务调用

文章目录 一、搭建Nacos服务1、Nacos2、安装Nacos3、Docker安装Nacos 二、OpenFeign和Dubbo远程调用Nacos的服务1、搭建SpringCloudAlibaba的开发环境1.1 构建微服务聚合父工程1.2 创建子模块cloud-provider-payment80011.3 创建子模块cloud-consumer-order80 2、远程服务调用O…

CORDIC算法理论详解

一、前言 要理解cordic算法,我们先证明一道中学的数学题。 已知,OA逆时针旋转θ角度后得到OB,线段OAOB,∠AOBθ,A 点坐标(x1,y1),B 点坐标(x2,y2)。 求证:…

Linux学习之系统函数库

cat /etc/redhat-release看到操作系统的版本是CentOS Linux release 7.6.1810 (Core),uname -r可以看到内核版本是3.10.0-957.21.3.el7.x86_64,bash --version可以bash的版本是4.2.46。 在/etc/init.d/functions有许多系统定义好的函数,比如…

数据结构基础:3.单链表的实现。

单链表的介绍和实现 一.基本概念1.基本结构2.结构体节点的定义: 二.功能接口的实现0.第一个节点:plist1打印链表2创建一个节点3.头插4.头删5.尾插6.尾删7.查找8.在pos之前插入x9.在pos之后插入x10.删除pos位置11.删除pos的后一个位置12.链表释放 三.整体…

缩略所写的代码

有一长串的代码需要进行缩略 可以在要缩略的代码的前一行加上注释。并在其中写上 #region。 在最后一行的下一行加上注释,并在其中写上 #endregion。 最终结果:

“华为杯”研究生数学建模竞赛2019年-【华为杯】D题:汽车行驶工况构建

目录 摘 要: 1.问题背景与问题重述 1.1 问题背景 1.2 问题重述 2.模型假设 3.符号说明 4.问题一的求解 4.1 问题分析 4.2 异常数据的处理 4.2.1 明显错误数据的处理 4.2.2 加减速异常数据的处理 4.3 缺失数据的处理 4.3.1 数据插补处理 4.3.2 视为长期停车处理 4.3.…

springboot编写mp4视频播放接口

简单粗暴方式 直接读取指定文件,用文件流读取视频文件,输出到响应中 GetMapping("/display1/{fileName}")public void displayMp41(HttpServletRequest request, HttpServletResponse response,PathVariable("fileName") String fi…

数学分析:流形1

光滑道路是一个映射,但我们通过光滑道路的这个名词,可以想象成一个曲线。然后这个曲线上就会有一个速度的概念,这个速度在不同道路上(但都经过同一个点x_0)会有不同的方向,他们组成的空间就是切空间。速度就…

The user specified as a definer (‘mysql.infoschema‘@‘localhost‘) does not exist

连接上报无法刷新浏览器 use mysql; show tables; ERROR 1449 (HY000): The user specified as a definer (mysql.infoschemalocalhost) does not existselect user,host from user; 删除 drop user ‘mysql.infoschema’‘127.0.0.1’; 重现创建 create user ‘mysql.infosc…

《视觉SLAM十四讲》笔记(4-6)

文章目录 4 李群与李代数4.1 李群与李代数基础4.1.1 群4.1.2 李代数的引出4.1.3 李代数的定义 4.2 指数与对数映射4.3 李代数求导与扰动模型 5 相机与图像5.1 相机模型5.1.1 针孔相机模型5.1.2 畸变5.1.3 双目相机5.1.4 RGB-D相机 6 非线性优化 4 李群与李代数 为了解决什么样…

Redis学习路线(6)—— Redis的分布式锁

一、分布式锁的模型 (一)悲观锁: 认为线程安全问题一定会发生,因此在操作数据之前先获取锁,确保线程串行执行。例如Synchronized、Lock都属于悲观锁。 优点: 简单粗暴缺点: 性能略低 &#x…

KWP2000协议和OBD-K线

KWP2000最初是基于K线的诊断协议, 但是由于后来无法满足越来越复杂的需求,以及自身的局限性,厂商又将这套应用层协议移植到CAN上面,所以有KWP2000-K和KWP2000-CAN两个版本。 这篇文章主要讲基于K线的早期版本协议,认…

【数据结构】无头+单向+非循环链表(SList)(增、删、查、改)详解

一、链表的概念及结构 1、链表的概念 之前学习的顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,而链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的,可以实现更加…

Element UI如何自定义样式

简介 Element UI是一套非常完善的前端组件库,但是如何个性化定制其中的组件样式呢?今天我们就来聊一聊这个 举例 就拿最常见的按钮el-button来举例,一般来说默认是蓝底白字。效果图如下 可是我们想个性化定制,让他成为粉底红字应…

在windows上安装minio

1、下载windows版的minio: https://dl.min.io/server/minio/release/windows-amd64/minio.exe 2、在指定位置创建一个名为minio文件夹,然后再把下载好的文件丢进去: 3、右键打开命令行窗口,然后执行如下命令:(在minio.…

【数据结构】栈(Stack)的实现 -- 详解

一、栈的概念及结构 1、概念 栈:一种特殊的线性表,其只允许在表尾进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出 LIFO(Last In First Out)的原则。 压栈…

Android Glide预处理preload原始图片到成品resource 预加载RecyclerViewPreloader,Kotlin

Android Glide预处理preload原始图片到成品resource & 预加载RecyclerViewPreloader&#xff0c;Kotlin <uses-permission android:name"android.permission.READ_EXTERNAL_STORAGE" /><uses-permission android:name"android.permission.READ_MED…

集合的概述

基本的集合有六种&#xff0c;分别是Vector、ArrayList、LinkedList、TreeSet、HashSet、LinkedHashSet 其中Vector、ArrayList、LinkedList实现了List接口&#xff0c;LinkedHashSet实现了HashSet接口&#xff0c;TreeSet、HashSet实现了Set接口 List和Set又实现了Collectio…

Anaconda原理解析及使用

anaconda想必大家都不陌生&#xff0c;属于使用python的重要工具&#xff0c;更是学习机器学习、深度学习的必备工具。在搭建环境过程中&#xff0c;感觉出现的许多问题根源在于对于anaconda的基本原理理解不到位&#xff0c;导致许多无效操作。为此&#xff0c;我重温了一遍an…

TypeScript实战篇 - TS实战:花田APP的架构

目录 TS实现花田APP的聊天Node端 整体架构 项目拆分 项目的特点 模型层 所有系统都是模型的外设 模型层的优势 TS实现花田APP的聊天Node端 整体架构 项目拆分 代号&#xff1a;huatian 5个独立的npm包 huatian/ui 花田的主项目huatian/component 花田组件库huatian/…