REST API的基础:HTTP

news/2024/5/14 3:10:03

在本文中,我们将深入探讨万维网数据通信的基础 - 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.mrgr.cn/p/15127018

相关文章

使用TensorFlow训练深度学习模型实战(下)

大家好,本文接TensorFlow训练深度学习模型的上半部分继续进行讲述,下面将介绍有关定义深度学习模型、训练模型和评估模型的内容。 定义深度学习模型 数据准备完成后,下一步是使用TensorFlow搭建神经网络模型,搭建模型有两个选项…

Android 中 app freezer 原理详解(一):S 版本

基于版本:Android S 0. 前言 在之前的两篇博文《Android 中app内存回收优化(一)》和 《Android 中app内存回收优化(二)》中详细剖析了 Android 中 app 内存优化的流程。这个机制的管理通过 CachedAppOptimizer 类管理,为什么叫这个名字,而不…

k8s一站式使用笔记

前言 个人感觉比较磨心态,要坐住,因为细节太多,建议:一遍看个大概,二遍回来细品,不要当成任务,把握零碎时间 一、k8s安装 1、配置准备 硬件要求 内存:2GB或更多RAMCPU: 2核CPU或更…

【RabbitMQ】Linux系统服务器安装RabbitMQ

一、下载 首先应该下载erlang,rabbitmq运行需要有erland环境。 官网地址:https://www.erlang.org/downloads 下载rabbitmq 官网环境:https://www.rabbitmq.com/download.html 注意:el7对应centos7,el8对应centos8…

centos下安装ftp-读取目录列表失败-

1.下载安装ftp服务器端和客户端 #1.安装yum -y install vsftpdyum -y install ftp #2.修改配置文件vim /etc/vsftpd.conflocal_enablesYESwrite_enableYESanonymous_enableYESanon_mkdir_write_enableYES //允许匿名用户在FTP上创建目录anon_upload_enableYES //允许匿名用户…

数值线性代数: 共轭梯度法

本文总结线性方程组求解的相关算法,特别是共轭梯度法的原理及流程。 零、预修 0.1 LU分解 设,若对于,均有,则存在下三角矩阵和上三角矩阵,使得。 设,若对于,均有,则存在唯一的下三…

kotlin 编写一个简单的天气预报app(四)

编写界面来显示返回的数据 用户友好性&#xff1a;通过界面设计和用户体验优化&#xff0c;可以使天气信息更易读、易理解和易操作。有效的界面设计可以提高用户满意度并提供更好的交互体验。 增加城市名字的TextView <TextViewandroid:id"id/textViewCityName"…

matlab使用教程(5)—矩阵定义和基本运算

本博客介绍如何在 MATLAB 中创建矩阵和执行基本矩阵计算。 MATLAB 环境使用矩阵来表示包含以二维网格排列的实数或复数的变量。更广泛而言&#xff0c;数组为向量、矩阵或更高维度的数值网格。MATLAB 中的所有数组都是矩形&#xff0c;在这种意义上沿任何维度的分量向量的长度…

【英杰送书第三期】Spring 解决依赖版本不一致报错 | 文末送书

Yan-英杰的主 悟已往之不谏 知来者之可追 C程序员&#xff0c;2024届电子信息研究生 目录 问题描述 报错信息如下 报错描述 解决方法 总结 【粉丝福利】 【文末送书】 目录&#xff1a; 本书特色&#xff1a; 问题描述 报错信息如下 Description:An attempt…

三、前端高德地图、测量两个点之前的距离

点击测距工具可以开启测量&#xff0c;再次点击关闭测量&#xff0c;清除地图上的点、连线、文字 再次点击测量工具的时候清除。 首先 上面的功能条河下面的地图我搞成了两个组件&#xff0c;他们作为兄弟组件存在&#xff0c;所以简单用js写了个事件监听触发的对象&#xff…

视频怎么加水印?这几种加水印方法非常简单

给视频加水印是一种保护知识产权的方法。水印是一种数字标记&#xff0c;可以包括作者的名称、品牌标识或其他信息&#xff0c;以便识别和追踪视频的来源。通过给视频加水印&#xff0c;能够有效地防止视频被盗用或未经授权的使用&#xff0c;让我们的知识产权得到更好的保护。…

fpga开发——蜂鸣器

蜂鸣器的原理 有源蜂鸣器和无源蜂鸣器 无源蜂鸣器利用电磁感应现象&#xff0c;为音圈接入交变电流后形成的电磁铁与永磁铁相吸或相斥而推动振膜发声&#xff0c;接入直流电只能持续推动振膜而无法产生声音&#xff0c;只能在接通或断开时产生声音。无源蜂鸣器的工作原理与扬声…

Ueditor 百度强大富文本Springboot 项目集成使用(包含上传文件和上传图片的功能使用)简单易懂,举一反三

Ueditor 百度强大富文本Springboot 项目集成使用 首先如果大家的富文本中不考虑图片或者附件的情况下&#xff0c;只考虑纯文本且排版的情况下我们可以直接让前端的vue来继承UEditor就可以啦。但是要让前端将那几个上传图片和附件的哪些功能给阉割掉&#xff01; 然后就是说如…

Cisco 路由器配置管理

大多数网络中断的最常见原因是错误的配置更改。对网络设备配置的每一次更改都伴随着造成网络中断、安全问题甚至性能下降的风险。计划外更改使网络容易受到意外中断的影响。 Network Configuration Manager 网络更改和配置管理 &#xff08;NCCM&#xff09;解决方案&#xff…

14个最强大的建筑设计AI工具

在整个行业中&#xff0c;建筑师在他们的创造性追求中正在拥抱一个新的合作伙伴&#xff1a;AI。 一旦受到重复和单调的困扰&#xff0c;建筑工人发现自己正处于数字革命的风口浪尖&#xff0c;其中比特和字节掌握着自动化和曾经难以想象的可能性的关键。 推荐&#xff1a;用 …

【Linux】网络基础之TCP协议

目录 &#x1f308;前言&#x1f338;1、基本概念&#x1f33a;2、TCP协议报文结构&#x1f368;2.1、源端口号和目的端口号&#x1f369;2.2、4位首部长度&#x1f36a;2.3、32位序号和确认序号&#xff08;重点&#xff09;&#x1f36b;2.4、16位窗口大小&#x1f36c;2.5、…

golang单元测试及mock总结

文章目录 一、前言1、单测的定位2、vscode中生成单测 二、构造测试case的注意事项1、项目初始化2、构造空interface{}3、构造结构体的time.Time类型4、构造json格式的test case 三、运行单测文件1、整体运行单测文件2、运行单个单测文件报错&#xff08;1&#xff09;command-l…

IO流(2)-缓冲流

1. 缓冲流的简单介绍 我们上贴说到了 FileInputStream&#xff0c;FileOutputStream&#xff0c;FileReader&#xff0c;FileWriter。 其实这四个流&#xff0c;我们通常把它叫做原始流&#xff0c;它们是比较偏底层的&#xff1b;而今天我们要说的四个缓冲流&#xff0c;如…

微服务 云原生:搭建 K8S 集群

为节约时间和成本&#xff0c;仅供学习使用&#xff0c;直接在两台虚拟机上模拟 K8S 集群搭建 踩坑之旅 系统环境&#xff1a;CentOS-7-x86_64-Minimal-2009 镜像&#xff0c;为方便起见&#xff0c;直接在 root 账户下操作&#xff0c;现实情况最好不要这样做。 基础准备 关…