当前位置: 首页 > news >正文

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问题中讨论过。下面的图表应该对此有所复习。


相关文章:

REST API的基础:HTTP

在本文中,我们将深入探讨万维网数据通信的基础 - HTTP。 什么是超文本? HTTP(超文本传输协议)的命名源于“超文本”。 那么,什么是超文本? 想象一下由超链接组成的文本、图像和视频的混合物。这些链接充当我…...

基于Docker-compose创建LNMP环境并运行Wordpress网站平台

基于Docker-compose创建LNMP环境并运行Wordpress网站平台 1.Docker-Compose概述2.YAML文件格式及编写注意事项3.Docker-Compose配置常用字段4.Docker Compose常用命令5.使用Docker-compose创建LNMP环境,并运行Wordpress网站平台1. Docker Compose 环境安装下载安装查…...

【雕爷学编程】MicroPython动手做(02)——尝试搭建K210开发板的IDE环境3

4、下载MaixPy IDE,MaixPy 使用Micropython 脚本语法,所以不像 C语言 一样需要编译,要使用MaixPy IDE , 开发板固件必须是V0.3.1 版本以上(这里使用V0.5.0), 否则MaixPy IDE上会连接不上, 使用前尽量检查固…...

Java语言跨平台执行的核心JVM

本文重点 在前面的课程中,我们介绍了java中的三层JDK->JRE->JVM,其中JVM称为Java的虚拟机,只是用来执行的,JRE是运行环境,要想在操作系统中运行,除了JVM还需要类库,JDK=JRE+开发的包和工具。本文就将介绍一下JVM究竟为何物? JVM 有的人会认为JVM是java中的东西…...

家政服务小程序制作攻略揭秘

想要打造一个家政服务小程序,但是又不懂编程和设计?不用担心!下面将为你详细介绍如何利用第三方平台,从零开始打造一个家政服务小程序。 首先,你需要找到一个适合的第三方平台,例如乔拓云网。在乔拓云网的【…...

2023-07-29力扣每日一题

链接&#xff1a; 141. 环形链表 题意&#xff1a; 求链表是否有环 解&#xff1a; 刚好昨天做完的初级算法链表题&#xff0c;翻转和暴力 实际代码&#xff1a; #include<iostream> using namespace std; struct ListNode {int val;ListNode *next;ListNode() : …...

Dual pyramid GAN for semantic image synthesis

为了解决在图像合成时候小物体容易消失&#xff0c;大物体经常作为块的拼接来生成的。本文提出DP-GAN在所有尺度下共同学习空间自适应归一化模块的条件。这样尺度信息就会被双向使用&#xff0c;他统一了不同尺度的监督。(重点看图和代码) SPADE模块解释 GAN在生成包含许多不同…...

【Linux】更换jdk版本

目录 一、前言二、查看jdk版本号1、项目中的版本号&#xff08;pom.xml&#xff09;2、服务器中的版本号 三、更换jdk版本1、创建java文件夹2、下载并解压JDK安装包①、下载jdk安装包②、移动到创建好的/usr/local/java路径下③、解压jdk安装包 四、删除原来的jdk版本1、删除原…...

web-暴力破解密码

Burte Force&#xff08;暴力破解&#xff09;概述 暴力破解”是一攻击具手段&#xff0c;在web攻击中&#xff0c;一般会使用这种手段对应用系统的认证信息进行获取。 其过程就是使用大量的认证信息在认证接口进行尝试登录&#xff0c;直到得到正确的结果。 为了提高效率&…...

基础实验篇 | CopterSim中回传提示消息实验

基础实验篇|CopterSim中回传提示消息实验 01实验名称及目的 回传提示消息实验&#xff1a;在飞控中&#xff0c;我们时常需要向外发布一些文字消息&#xff0c;来反映系统当前的运行状态&#xff0c;这个功能可以通过发送“mavlink_log”的uORB消息来实现。 02实验效果 在Cop…...

vue基础-动态style

vue基础-动态style 1、目标2、语法 1、目标 给标签动态设置style值 2、语法 :style"{style属性名:值}"示例&#xff1a; <template><div id"app"><div><p :style"{backgroundColor:color}">动态styleclass</p>…...

vue3使用响应式数据 + v-model导致响应式失效el-form表单无法输入的问题

文章目录 vue3使用响应式数据 v-model导致响应式失效el-form表单无法输入的问题 vue3使用响应式数据 v-model导致响应式失效el-form表单无法输入的问题 参考文章 重构vue2项目时发现的问题&#xff0c;原始项目使用的是Element-ui。 其实vue3可以使用适配的Element-plus 问…...

线段树详解 原理解释 + 构建步骤 + 代码(带模板)

目录 介绍&#xff1a; 定义&#xff1a; 以具体一个题目为例&#xff1a;​ 树的表示方法&#xff1a; 实现步骤&#xff1a; 构建结点属性&#xff1a; pushup函数&#xff1a; build函数&#xff1a; pushdown函数&#xff1a; modify函数&#xff1a; query…...

Java中Timer的使用

Timer 简述 在Java中&#xff0c;Timer&#xff08;计时器&#xff09;是一个用于安排定时任务的类。它可以实现在指定的时间间隔或指定的时间点执行某项任务或操作。 简单的来说Timer就是在Java中用来实现定时任务的工具。 Timer的API Timer中有两API可以使用分别是schedule…...

关于EJB,这两文把热闹和门道都说清楚了

关于技术的很多概念&#xff0c;如果你是小白&#xff0c;不建议看官网。原因就在于官网描述太抽象&#xff0c;就像八股文&#xff0c;看完感觉好像说了很多&#xff0c;但回过头又感觉似乎啥都没说。太虚、不接地气&#xff0c;是最大毛病。其实这些官网的打太极式的表述&…...

MixFormerV2: Efficient Fully Transformer Tracking

摘要 基于变压器的跟踪器在标准基准测试上取得了很强的精度。然而&#xff0c;它们的效率仍然是在GPU和CPU平台上实际部署的一个障碍。在本文中&#xff0c;为了克服这一问题&#xff0c;我们提出了一个完全变压器跟踪框架&#xff0c;称为MixFormerV2&#xff0c;没有任何密集…...

K8S中网络如何通信

Kubernetes 提出了一个自己的网络模型“IP-per-pod”&#xff0c;能够很好地适应集群系统的网络需求&#xff0c;它有下面的这 4 点基本假设&#xff1a; 集群里的每个 Pod 都会有唯一的一个 IP 地址。Pod 里的所有容器共享这个 IP 地址。集群里的所有 Pod 都属于同一个网段。…...

LangChain Agents深入剖析及源码解密上(三)

AutoGPT案例V1版本 AutoGPT是一个实验性的开源应用程序,展示了GPT-4语言模型的功能,AutoGPT程序由GPT-4驱动,将大语言模型的思考链接在一起,以自主实现设定的任何目标。作为GPT-4完全自主运行的首批例子之一,AutoGPT突破了人工智能的可能性。LangChain框架复现了https://g…...

分布式限流方案及实现

优质博文&#xff1a;IT-BLOG-CN 一、限流的作用和意义 限流是对高并发访问进行限制&#xff0c;限速的过程。通过限流来限制资源&#xff0c;可以提高系统的稳定性和可靠性&#xff0c;控制系统的负载&#xff0c;削峰填谷&#xff0c;保证服务质量。 服务限流后的常见处理…...

vuejs源码阅读之优化器

前面讲过vuejs中解析器是把html模版解析成AST&#xff0c;而优化器的作用是在AST中找到静态子树并打上标记。 静态子树是指的那些在AST中永远不会发生变化的节点。 例如&#xff0c;一个纯文本节点就是静态子树&#xff0c;而带变量的文本节点就不是静态子树&#xff0c;因为…...

XCTF-web-easyupload

试了试php&#xff0c;php7&#xff0c;pht&#xff0c;phtml等&#xff0c;都没有用 尝试.user.ini 抓包修改将.user.ini修改为jpg图片 在上传一个123.jpg 用蚁剑连接&#xff0c;得到flag...

【WiFi帧结构】

文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成&#xff1a;MAC头部frame bodyFCS&#xff0c;其中MAC是固定格式的&#xff0c;frame body是可变长度。 MAC头部有frame control&#xff0c;duration&#xff0c;address1&#xff0c;address2&#xff0c;addre…...

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility 1. 实验室环境1.1 实验室环境1.2 小测试 2. The Endor System2.1 部署应用2.2 检查现有策略 3. Cilium 策略实体3.1 创建 allow-all 网络策略3.2 在 Hubble CLI 中验证网络策略源3.3 …...

相机Camera日志分析之三十一:高通Camx HAL十种流程基础分析关键字汇总(后续持续更新中)

【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:有对最普通的场景进行各个日志注释讲解,但相机场景太多,日志差异也巨大。后面将展示各种场景下的日志。 通过notepad++打开场景下的日志,通过下列分类关键字搜索,即可清晰的分析不同场景的相机运行流程差异…...

【C语言练习】080. 使用C语言实现简单的数据库操作

080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...

【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)

升级Dledger高可用集群 一、主从架构的不足与Dledger的定位 主从架构缺陷 数据备份依赖Slave节点&#xff0c;但无自动故障转移能力&#xff0c;Master宕机后需人工切换&#xff0c;期间消息可能无法读取。Slave仅存储数据&#xff0c;无法主动升级为Master响应请求&#xff…...

laravel8+vue3.0+element-plus搭建方法

创建 laravel8 项目 composer create-project --prefer-dist laravel/laravel laravel8 8.* 安装 laravel/ui composer require laravel/ui 修改 package.json 文件 "devDependencies": {"vue/compiler-sfc": "^3.0.7","axios": …...

MySQL 知识小结(一)

一、my.cnf配置详解 我们知道安装MySQL有两种方式来安装咱们的MySQL数据库&#xff0c;分别是二进制安装编译数据库或者使用三方yum来进行安装,第三方yum的安装相对于二进制压缩包的安装更快捷&#xff0c;但是文件存放起来数据比较冗余&#xff0c;用二进制能够更好管理咱们M…...

(一)单例模式

一、前言 单例模式属于六大创建型模式,即在软件设计过程中,主要关注创建对象的结果,并不关心创建对象的过程及细节。创建型设计模式将类对象的实例化过程进行抽象化接口设计,从而隐藏了类对象的实例是如何被创建的,封装了软件系统使用的具体对象类型。 六大创建型模式包括…...

MySQL:分区的基本使用

目录 一、什么是分区二、有什么作用三、分类四、创建分区五、删除分区 一、什么是分区 MySQL 分区&#xff08;Partitioning&#xff09;是一种将单张表的数据逻辑上拆分成多个物理部分的技术。这些物理部分&#xff08;分区&#xff09;可以独立存储、管理和优化&#xff0c;…...