REST API的基础:HTTP

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

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

相关文章

Restful的详细介绍~

RESTFUL简介: Restful是我们看待服务器的一种方式,我们都知道Java一切皆对象,因此在Java中,我们可以将所有的内容都看成对象,而在这里,RESTFUL是我们看待服务器的一种方式,我们可将服务器中的所…

C语言的链表操作

C语言中可以使用结构体和指针实现链表操作。链表是一种动态数据结构,由节点组成,每个节点包含一个数据元素和一个指向下一个节点的指针。以下是一个简单的示例: #include <stdio.h> #include <stdlib.h>// 定义链表节点结构体 struct Node {int data;struct No…

【C++】多态的实现及其底层原理

个人主页&#xff1a;&#x1f35d;在肯德基吃麻辣烫 我的gitee&#xff1a;gitee仓库 分享一句喜欢的话&#xff1a;热烈的火焰&#xff0c;冰封在最沉默的火山深处。 文章目录 前言一、什么是多态&#xff1f;二、多态的构成条件2.1什么是虚函数&#xff1f;2.2虚函数的重写2…

pycharm 远程连接服务器并且debug, 支持torch.distributed.launch debug

未经允许&#xff0c;本文不得转载&#xff0c;vx&#xff1a;837007389 文章目录 step1&#xff1a;下载专业版本的pycharmstep2 配置自动同步文件夹&#xff0c;即远程的工程文件和本地同步2.1 Tools -> Deployment -> configuration2.2 设置同步文件夹2.3 同步服务器…

【深度学习】WaveMix: A Resource-efficient Neural Network for Image Analysis 论文

论文&#xff1a;https://arxiv.org/abs/2205.14375 代码&#xff1a;https://github.com/pranavphoenix/WaveMix 文章目录 ABSTRACTIntroductionBackground and Related WorksWaveMix Architectural FrameworkOverall architectureWaveMix block Experiments and ResultsTasks…

机器学习深度学习——Dropout

&#x1f468;‍&#x1f393;作者简介&#xff1a;一位即将上大四&#xff0c;正专攻机器学习的保研er &#x1f30c;上期文章&#xff1a;机器学习&&深度学习——权重衰减 &#x1f4da;订阅专栏&#xff1a;机器学习&&深度学习 希望文章对你们有所帮助 Drop…

ffmpeg常用功能博客导航

FFmpeg 是一个处理视频和音频内容的开源工具库&#xff0c;可以实现编码、解码、转码、流媒体和后处理等服务。 推荐博客&#xff1a; 常见命令和使用案例 用ffmpeg转mov为mp4格式 FFmpeg 常用命令 FFmpeg 常用命令编辑音/视频&#xff08;转换格式、压缩、裁剪、截图、切分合…

centos7安装nginx

一、下载安装包 方式一&#xff1a;官网下载 到nginx官网下载 然后上传到linux 服务器 方式二: wget 下载 wget http://nginx.org/download/nginx-1.22.0.tar.gz二、安装nginx 先安装相关依赖 yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel 创建…

什么是 ASP.NET Core SignalR?

所有连接了 Internet 的应用程序都由服务器和客户端组成。 客户端依赖于服务器获取数据&#xff0c;而它们获取数据的主要机制是通过发出超文本传输协议 (HTTP) 请求来进行的。 某些客户端应用程序需要经常更改的数据。 ASP.NET Core SignalR 提供了一个 API&#xff0c;用于创…

(三)4. 深度生成模型-扩散模型(基于扩散的生成模型与分数匹配的变分视角)

“基于扩散的生成模型”与“分数匹配”的变分视角 1. 介绍1.1. 变分自动编码器1.2. 基于扩散的建模1.3. 主要内容2. 基于得分的随机微分方程生成建模基于离散时间扩散的生成模型和分数匹配方法在高维图像数据建模方面显示出了良好的效果。 最近,Song等人(2021)表明,通过学…

(Python):元类(metaclass), Type类,类实例,dataclass

文章目录 类实例类成员变量与成员变量的区别 Type类MetaclassABCMeta dataclass 类实例 在python中&#xff0c;所有的类都是一个实例&#xff0c;也就是说&#xff0c;所有的类其实都是由自己的属性和方法的。 这里就需要区分清楚一件事&#xff0c;类实例和对象。类实例指的…

使用vim-cmd工具给ESXi虚机定期打快照

VMware虚拟化 - 建设篇 第四章 使用vim-cmd工具给ESXi虚机定期打快照 VMware虚拟化 - 建设篇系列文章回顾使用vim-cmd工具给ESXi虚机定期打快照前言前提条件ESXi新增执行快照备份的sh脚本ESXi添加crond任务并使其生效ESXi指定部分虚拟机不执行定期快照(附加)虚拟机自定义属性…

ChatGPT有几个版本,哪个版本最强,如何选择适合自己的?

​ChatGPT就像内容生产界的瑞士军刀。它可以是数学导师、治疗师、职业顾问、编程助手&#xff0c;甚至是旅行指南。只要你知道如何让它做你想做的事&#xff0c;ChatGPT几乎可以提供你要的任何东西。 但重要的是&#xff0c;你知道哪个版本的ChatGPT最能满足你的需求吗&#x…

Windows 11 下 OpenFace 2.2.0 的安装

写在前面 最近需要做关于面部的东西&#xff0c;所以需要使用到OpenFace这个工具&#xff0c;本文仅用来记录本人安装过程以供后续复现&#xff0c;如果可以帮助到读者也是非常荣幸。 安装过程 不编译直接使用 这种方法可以直接从官方下载下来编译好的exe以及gui进行使用&a…

在 “小小容器” WasmEdge 里运行小小羊驼 llama 2

昨天&#xff0c;特斯拉前 AI 总监、OpenAI 联合创始人 Andrej Karpathy 开源了 llama2.c 。 只用 500 行纯 C 语言就能训练和推理 llama 2 模型的框架&#xff0c;没有任何繁杂的 python 依赖。这个项目一推出就受到大家的追捧&#xff0c;24 小时内 GitHub 收获 4000 颗星&am…

Codeforces Round 889 (Div. 2) (C1~C2)

掉大分&#xff0c;C1被sb错误困扰。 提示如果C1会了但不会C2,也应该先将C1解法看一遍 C1 Dual (Easy Version) 题意 给定长度为 n n n 的数组 a a a&#xff0c;&#xff08; n < 20 &#xff0c; − 20 < a i < 20 n<20&#xff0c;-20<a_i<20 n&l…

KY222 打印日期+KY111日期差值

一、KY222题目 二、代码 #include <climits> #include <iostream> using namespace std; class Date{public:Date(int year 1,int month 2,int day 3){_year year;_month month;_day day;}int GetDay(int year ,int month);void Define(int n);public:int _yea…

查看进程方式

目录 ps top uptime pstree ps 查看静态的进程统计信息 top 实时显示系统中各个进程的资源占用情况 第一行 top - 17:00:23 up 15 min, 1 user, load average: 1.05, 1.22, 0.98 17:00:23————当前时间 up 15 min————系统运行时间 1 user————当前登录用户数…

陪诊小程序软件|陪诊系统定制|医院陪诊小程序

开发一个陪诊小程序需要投入一定的费用&#xff0c;具体金额会因项目的复杂程度、功能需求和推广政策而有所差异在投入资金之前&#xff0c;建议进行市场调研和需求分析&#xff0c;制定出合理的预算&#xff0c;并选择专业的开发团队进行合作&#xff0c;那么开发陪诊小程序需…

django模板继承和组件了解

1、模板继承 什么时候需要用到模板呢&#xff0c;比如我们在开发的页面的导航栏&#xff0c;你点不同的功能页面这个导航栏都是一样的&#xff0c;如果每个页面都要加上这个导航条会写重复代码&#xff0c;而且如果导航条有变化&#xff0c;每个页面都要修改&#xff0c;这个是…