HTTP详解
一,什么是HTTP
HTTP(全称为“超文本传输协议”)',是一种应用非常广泛的应用层协议,之前在《初识网络原理》的博客(初识网络原理_徐憨憨!的博客-CSDN博客)中,有详细讲解过TCP/IP五层模型,其中应用层描述了数据的传输,负责应用程序间的沟通。
HTTP作为一个应用层协议,同样需要通过封装和分用来进行交互,HTTP往往是基于传输层的TCP协议实现的,实现了浏览器和服务器之间的交互;例如当我们在浏览器中输入一个百度的网址(URL)时,浏览器就会给百度服务器发送一个HTTP请求,百度的服务器就会给浏览器返回一个HTTP响应:

这个响应被浏览器解析之后,就展示成我们看到的页面内容,这个过程中,浏览器可能给服务器发送了多个请求,服务器对应的也会返回多个响应,这些响应里就包含了页面HTML,CSS,JavaScript,图片,文字等。
二,HTTP 的工作过程
1.工作过程
核心:浏览器给服务器发送请求,服务器响应浏览器的请求,HTTP就是浏览器和服务器之间交互的桥梁

2.抓包
现在我们大致知道了HTTP通过发送请求,然后服务器响应请求这样的过程来进行交互的,同时当我们访问一个网站时,可能涉及不止一次的请求/响应的过程,那如何知道http协议交互的详细过程呢?此时就需要借助第三方工具(称为“抓包”工具:fiddler)来看到。
1.fiddler的下载和使用
进入fiddler下载的官网进行下载安装(https://www.telerik.com/fiddler/)


打开fiddler,安装https证书(因为大部分的hhtp协议都加密成了https)

3.选取一个抓取的包查看请求和响应

2.抓包工具的原理
Fidler相当于一个“代理”,当浏览器输入百度的网址进行访问时,就会先把请求发送给Fiddler,Fiddler再把请求转发给百度的服务器,当百度的服务器拿到数据返回时,Fiddler先拿到返回数据,再把数据交给浏览器,所以Fiddler可以清楚的知道浏览器和防服务器之间交互的数据细节。
三,HTTP协议格式
1.HTTP请求:

首行:【方法】+【URL】+【版本】;
Header:请求的属性,冒号分割的键值对;每组属性之间使用\n分隔;遇到空行表示Header部分结束;
Body:空行后面的内容是Body,Body允许空字符串,如果Body存在,则在Header中会有一个Content-Length属性来表示Body的长度。
2.HTTP响应:

首行:【版本号】+【状态码】+【状态码解释】;
Header:请求的属性,冒号分割的键值对;每组属性之间使用\n分隔;遇到空行表示Header部分结束;
Body:空行后面的内容是Body,Body允许空字符串,如果Body存在,则在Header中会有一个Content-Length属性来表示Body的长度,如果服务器返回了一个HTML页面,那么HTML页面内容就是在Body中。
3.格式图片总结

思考:为什么HTTP报文中要存在“空行”?
因为HTTP协议并没有规定报头部分的键值对有多少个,空行就相当于是“报头的结束标记”,或者是“报头和正文之间的分隔符”,HTTP在传输层依赖TCP协议,TCP是面向字节流的,如果没有这个空行,就会出现“粘包问题”。
四,HTTP请求
1.URL基本格式
URL(统一资源定位符)就是平时俗称的“网址”,互联网上的每一个文件都有一个唯一的URL,它包含的信息指出文件的位置以及浏览器应该怎么处理它。

假设一个网址如下:
https://v.bitedu.vip/personInf/student?userId=10000&classId=100
https:协议方案名;常见的有http和https,也有其他的类型(例如访问mysql时用的jdbc:mysql);
user:pass:登录信息;现在的网站进行身份认证一般不再通过URL进行了,一般都会省略;
v.bitedu.vip:服务器地址;此处是一个“域名”,域名会通过DNS系统解析成一个具体的IP地址;
端口号:上面的URL中端口号被省略了,当端口号省略的时候,浏览器会根据协议类型自动决定使用哪个端口;例如http协议默认使用80端口,https协议默认使用443端口;
/personInf/student:带层次的文件路径;
userId=10000&classId=100:查询字符串(query string);本质是一个键值对,键值对之间使用&分隔,键和值之间使用=分隔;
片段标识:此URL中省略了片段标识,片段标识主要用于页面跳转。
注意:
query string中的内容是键值对结构,其中key和value的取值和个数,完全都是程序员自己约定的,可以通过这样的方式来自定制传输信息给服务器
URL中可以省略的部分:
协议名:可以省略,省略后默认为http://
ip地址/域名:在HTML中可以省略(比如img,link,script等),省略后表示服务器的ip/域名与
当前HTML所属的ip/域名一致
端口号:可以省略;省略后如果是http协议默认使用80端口,https协议默认使用443端口;
带层次的路径:可以省略;省略后相当于/,有些服务器会在发现/路径的时候自动访问/index.html;
查询字符串:可以省略;
片段标识:可以省略。
2.方法

GET方法
get方法是最常用的http方法,常用于获取服务器上的某个资源
触发GET请求的方法:
在浏览器中直接输入URL,此时浏览器就会发送出一个GET请求;
HTML中的link,img,script等标签,也会触发GET请求;
JavaScript中的ajax也能构造GET方法。
GET请求的特点:
首行的第一部分为GET;
URL的query string可以为空,也可以不为空;
hearder部分有若干个键值对结构;
body部分为空。
POST方法
POST方法也是一种常见的方法,多用于用户提交用户数据给服务器(例如登录页面)
触发POST请求的方法:
HTML的form标签可以构造POST请求;
JavaScript中的ajax也可以构造POST请求。
POST请求的特点:
首行的第一部分为POST;
URL的query string一般为空(也可以不为空);
hearder部分有若干个键值对结构;
body部分一般不为空,body内的数据格式通过header中的Content-type指定,body的长度由header中的Content-Length指定。
面试题:GET和POST的区别
核心:本质没有什么区别,只是使用习惯上的区别
语义不同:GET一般用于获取数据,POST一般用于提交数据;
GET的body一般为空,需要传递的数据通过query string传递,POST的query string一般为空,需要传递的数据通过body传递;
GET请求一般是幂等的,POST请求一般是不幂等的(如果多次请求得到的结果一样,就视为幂等);
GET可以被缓存,POST不能被缓存。
3.请求报头(Header)
header的整体格式是键值对结构,每个键值对占一行,键和值之间使用分号分割
HOST:表示服务器主机的地址和端口
Content-Length:表示body中的数据长度
Content-type:表示请求中的数据格式
User-Agent(UA):表示浏览器/操作系统的属性
Referer:表示这个页面是从哪个页面跳转过来的
Cookie:Cookie 中存储了一个字符串,这个数据可能是客户端(网页)自行通过 JS 写入的, 也可能来自于服务器(服务器在 HTTP 响应的 header 中通过 Set-Cookie 字段给浏览器返回数据);往往可以通过这个字段实现 "身份标识" 的功能;每个不同域名下都可以有不同的Cookie,不同网站之间的Cookie并不冲突
五,HTTP响应
1.状态码
状态码表示访问一个页面的结果(是访问成功,还是失败,还是一些其他的情况......)
常见状态码:
200 OK:表示访问成功
404 Not Found:表示没有找到资源
403 Forbidden:表示访问被拒绝,有的页面通常需要用户具有一定 的权限才能访问
500 Internal Server Error:表示服务器内部出现错误
504 Gateway Timeout:表示当前服务器负载比较大,服务器处理单条请求的时候消耗的时间就会很长,就可能导致出现超时的情况
302 Move temporarily:临时重定向
301 Moved Peramnently:永久重定向

2.响应报头
响应报头的基本格式和请求报头的格式基本一致
六,构造HTTP请求
利用form表单构造请求
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head>
<body><!-- --><form action="http://www.sougou.com" method="get"><input type="text" name="studentName"><!-- input type=submit 构造了一个特殊的 提交 按钮 value属性描述了按钮中的文本 --><!-- 点击这个按钮就会触发该 form 表单的"提交操作" 也就是构造http请求发送给服务器 --><input type="submit" value="提交"></form>
</body>
</html>

利用ajax构造请求
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head>
<body><!-- 引入 jquery --><script src="https://lib.baomitu.com/jquery/3.6.3/jquery.min.js"></script><script>$.ajax({type: 'get',url: 'https://www.sougou.com?studentName=zhangsan',//此处success就声明了一个回调函数,就会在服务器响应返回到浏览器的时候触发该回调//正是此处的回调体现了 "异步"success: function(data) {//data是响应的正文部分console.log("当服务器返回的响应到大浏览器之后,触发该回调");}});console.log("浏览器立即往下执行后续代码");</script>
</body>
</html>

相关文章:

HTTP详解
一,什么是HTTPHTTP(全称为“超文本传输协议”),是一种应用非常广泛的应用层协议,之前在《初识网络原理》的博客(初识网络原理_徐憨憨!的博客-CSDN博客)中,有详细讲解过TCP/IP五层模型,其中应用层描述了数据…...

cpufreq--处理器功耗控制
cpu 功耗控制 参考框架: cpufreq 框架。 cpufreq 框架提供 cpu 功耗管理接口,以及功耗管理方案。 用户可以通过功耗管理接口(以文件形式提供)来选择管理方案,并设置相关参数。 管理方案的实现则由具体的驱动来完成。…...

做技术,最忌讳东张西望
又好长时间没更新,研二了,忙着做实验、写论文、发论文,再加上给我导做一些事情(都习惯了,以前很不爽的事情,现在居然能这么平静的说出来)。 但这不是我今天说的重点,而是另外一件事…...
Oracle 常见报错问题汇总
Oracle 常见报错问题汇总 报错:ORA-01017: invalid username/password; logon denied报错:ORA-01031: insufficient privileges报错:"ORA-01034: ORACLE not available" 和 "ORA-27101: shared memory realm does not exist"报错:“ORA-00119: invalid…...

单片机连接有人云上传数据
首先采用有人物联网的模块 ,连接有人云平台服务器 看云平台相关配置配置连接设备在线后 添加设备添加设备完成后 添加变量模板 变量模板的添加方式如下 :本次采用的是标准的MODbus 协议添加一个温度变量温度变量如下显示云平台 下发数据 采集01 03 00 00…...
系统集成项目管理工程师:第18章项目风险管理学习笔记
第18章项目风险管理 一、目录 18.1 风险概述 18.1.1 风险的定义 18.1.2 风险的分类 18.1.3 风险的性质 18.2 项目风险管理 18.3 规划风险管理 18.3.1 规划风险管理的输入 18.3.2 规划风险管理的工具与技术 18.3.3 规划风险管理的输出 18.4 识别风险...

【笔试强训选择题】Day3.习题(错题)解析
文章目录 前言一、Day3习题(错题)解析二、Day3习题(原题)练习总结前言 今天我们将进入到第三天的练习,希望能一直坚持下去,不断反思总结错误,得到进步; 一、Day3习题(错…...

基于GPT-4的免费代码生成工具
大家好,我是herosunly。985院校硕士毕业,现担任算法研究员一职,热衷于机器学习算法研究与应用。曾获得阿里云天池比赛第一名,CCF比赛第二名,科大讯飞比赛第三名。拥有多项发明专利。对机器学习和深度学习拥有自己独到的见解。曾经辅导过若干个非计算机专业的学生进入到算法…...
Android开发的这一年里,Jetpack的Room源码是怎么狠狠奖励我的?
简述 Android Jetpack的出现统一了Android开发生态,各种三方库逐渐被官方组件所取代。Room也同样如此,逐渐取代竞品成为最主流的数据库ORM框架。这当然不仅仅因为其官方身份,更是因为其良好的开发体验,大大降低了SQLite的使用门槛…...

推荐一款卸载软件的小工具-《UninstallToo》
目录 UninstallToo介绍 UninstallToo下载 UninstallToo使用 总结 UninstallToo介绍 Uninstall Tool 是一款可以用来替代“添加/删除程序”的工具。它允许您显示隐藏的安装程序,按名称过滤已安装程序的列表,强行写在程序,浏览注册表项目&a…...

线程池——JUC随记8
线程池使用方式 1、一池N线程(Executors.newFixedThreadPool(n)) import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors;public class ExecutorDemo {public static void main(String[] args) {ExecutorService execu…...
SpringCloudAlibaba微服务调用组件-Feign
SpringCloudAlibaba微服务调用组件-Feign 本项目代码与笔记已存放在Gitee仓库 地址: 代码,笔记 文章目录SpringCloudAlibaba微服务调用组件-Feign1. 什么是Feign1.1 优势2. Spring Cloud Alibaba快速整合OpenFeign1)引入依赖2)编写…...
高效学习方法论
2023.03.17 《程序员的三门课:技术精进、架构修炼、管理探秘 / 于君泽等著》学习笔记 学会学习一、高效学习的方法1、管理好自己的目标1)评估能力2)制定目标3)评估目标2、利用好碎片时间3、在同一时间只做一件事二、高效学习的途径…...
C语言结构体(一篇学会)
C语言结构体 在C语言中,结构体是一种自定义的数据类型,它允许用户将不同类型的数据组合在一起。结构体由多个变量组成,这些变量称为结构体的成员。结构体成员可以是不同的数据类型,如整数、浮点数、字符或其他结构体等。 结构体…...

嵌入式软件开发之Linux下C编程
目录 前沿 Hello World! 编写代码 编译代码 GCC编译器 gcc 命令 编译错误警告 编译流程 Makefile 基础 何为 Makefile Makefile 的引入 前沿 在 Windows 下我们可以使用各种各样的 IDE 进行编程,比如强大的 Visual Studio。但是在Ubuntu 下如何进…...

普通Java工程师 VS 优秀架构师
1 核心能力 1.1 要成为一名优秀的Java架构师 只懂技术还远远不够,懂技术/懂业务/懂管理的综合型人才,才是技术团队中的绝对核心。 不仅仅是架构师,所有的技术高端岗位,对人才的综合能力都有较高的标准。 架构路线的总设计师 规…...
Java:SpringBoot实现ApplicationEvent事件的监听和发布
通过发布订阅模式实现数据的异步处理,比如异步处理邮件发送 新建SpringBoot项目 项目结构 . ├── pom.xml └── src└── main├── java│ └── com│ └── example│ └── demo│ ├── Application.java│ …...

星戈瑞-Sulfo-Cyanine3 azide?磺酸基-Cy3-N3叠氮基水溶性染料
Sulfo-Cyanine3 azide? 品牌:星戈瑞 CAS号:2055138-89-9 外观: 暗红色晶体 分子量:720.83 分子式:C34H45N6NaO8S2 纯度:95% 储藏条件:-20C 下避光保存 Sulfo-Cyanine3 azide 是一种…...

十大经典排序算法(下)
🍓个人主页:bit.. 🍒系列专栏:Linux(Ubuntu)入门必看 C语言刷题 数据结构与算法 HTML和CSS3 目录 1.6 快速排序 1. 算法步骤 2. 动图演示 3.代码实现 1.7 堆排序 1. 算法步骤 2. 动图演示 3. 代码实现 1.8 计数排…...

网络协议分析期末复习(四)
目录 0.前言 1.IP层对改善TCP性能支持的机制 2.TCP防止半开放连接的机制 3.TCP协议中强推位(P)和紧急位(U)的用法 4.TCP的流量控制和拥塞控制的异同点 异: (1)两者的特点不同:…...

盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来
一、破局:PCB行业的时代之问 在数字经济蓬勃发展的浪潮中,PCB(印制电路板)作为 “电子产品之母”,其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透,PCB行业面临着前所未有的挑战与机遇。产品迭代…...
2024年赣州旅游投资集团社会招聘笔试真
2024年赣州旅游投资集团社会招聘笔试真 题 ( 满 分 1 0 0 分 时 间 1 2 0 分 钟 ) 一、单选题(每题只有一个正确答案,答错、不答或多答均不得分) 1.纪要的特点不包括()。 A.概括重点 B.指导传达 C. 客观纪实 D.有言必录 【答案】: D 2.1864年,()预言了电磁波的存在,并指出…...
渲染学进阶内容——模型
最近在写模组的时候发现渲染器里面离不开模型的定义,在渲染的第二篇文章中简单的讲解了一下关于模型部分的内容,其实不管是方块还是方块实体,都离不开模型的内容 🧱 一、CubeListBuilder 功能解析 CubeListBuilder 是 Minecraft Java 版模型系统的核心构建器,用于动态创…...

Keil 中设置 STM32 Flash 和 RAM 地址详解
文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...

从零实现STL哈希容器:unordered_map/unordered_set封装详解
本篇文章是对C学习的STL哈希容器自主实现部分的学习分享 希望也能为你带来些帮助~ 那咱们废话不多说,直接开始吧! 一、源码结构分析 1. SGISTL30实现剖析 // hash_set核心结构 template <class Value, class HashFcn, ...> class hash_set {ty…...
数据库分批入库
今天在工作中,遇到一个问题,就是分批查询的时候,由于批次过大导致出现了一些问题,一下是问题描述和解决方案: 示例: // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...
MySQL中【正则表达式】用法
MySQL 中正则表达式通过 REGEXP 或 RLIKE 操作符实现(两者等价),用于在 WHERE 子句中进行复杂的字符串模式匹配。以下是核心用法和示例: 一、基础语法 SELECT column_name FROM table_name WHERE column_name REGEXP pattern; …...
【碎碎念】宝可梦 Mesh GO : 基于MESH网络的口袋妖怪 宝可梦GO游戏自组网系统
目录 游戏说明《宝可梦 Mesh GO》 —— 局域宝可梦探索Pokmon GO 类游戏核心理念应用场景Mesh 特性 宝可梦玩法融合设计游戏构想要素1. 地图探索(基于物理空间 广播范围)2. 野生宝可梦生成与广播3. 对战系统4. 道具与通信5. 延伸玩法 安全性设计 技术选…...

七、数据库的完整性
七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...

排序算法总结(C++)
目录 一、稳定性二、排序算法选择、冒泡、插入排序归并排序随机快速排序堆排序基数排序计数排序 三、总结 一、稳定性 排序算法的稳定性是指:同样大小的样本 **(同样大小的数据)**在排序之后不会改变原始的相对次序。 稳定性对基础类型对象…...