【网络原理】HTTP协议 | 报文格式 | Fiddler抓包 | HTTP请求 | HTTP响应 | 构造HTTP请求

文章目录

  • HTTP协议
            • 使用HTTP的场景:
    • 一、HTTP协议的报文格式
        • 1.Fiddler的使用教程
    • 二、HTTP请求(Request)
        • 1.首行:
          • 1)方法(method)
            • GET和POST的区别(面试题)
          • 2)URL
        • 2.请求头(header):
            • 1.HOST:
            • 2.Content-Length
            • 3.body中数据的格式:
            • 4.User-Agent(UA)
            • 5.Referer
            • 6.Cookie
        • 3.正文(body):
    • 三、HTTP响应
        • 1.首行
        • 2.响应头(header)
        • 3.正文
    • 四、如何让客户端构造一个HTTP请求


HTTP协议

  • HTTP超文本传输协议,是一种应用非常广泛的应用层协议。

最新版本是HTTP/3.0,但是目前大规模使用的版本仍是HTTP/1.1

使用HTTP的场景:

1.浏览器打开网站。网页和后台服务器的交互(基本上)

2.手机APP访问对应的服务器(大概率)

一、HTTP协议的报文格式

​ HTTP的报文格式,要分成 请求响应两个部分来看待。HTTP协议是一种“一问一答”结构模型的协议,请求和响应的协议格式,是有所差异的。

一问一答(访问网站)、多问一答(上传文件)、一问多答(下载文件)、 多问多答(串流、远程桌面)

  • 可以通过抓包工具来查看HTTP请求和响应的格式。
1.Fiddler的使用教程

抓包:把网卡上经过的数据,获取到并显示出来。Fiddler(专门抓HTTP)、wireshark工具。

在这里插入图片描述

  • 左侧是抓到的包,右上方是请求,右下方的响应。

​ 新安装的Fidder需要手动开启HTTPS功能,并且安装证书(否则只能抓HTTP)而当前的互联网环境上,以HTTPS为主,很少有纯HTTP。

Tools->Options->HTTPS都勾上 并安装证书。
在这里插入图片描述

​ Fiddler本质上是一个“正向代理”,可能会和其他的代理软件发生冲突。Fiddler代理的是客户端。把请求先给Fiddler,服务器回复的响应会先回到Fiddler,Fiddler再返回给客户端。因此,Fiddler可以获取到请求和响应的详细内容。

ctrl+a 全选,delete 清空当前全部抓到的包。

在这里插入图片描述

蓝色是获取到的HTML页面。选择后,看右上方的Raw选项:请求最原始的数据格式。

在这里插入图片描述

HTTP协议是文本格式的协议(内容都是字符),之前的TCP、UDP、IP协议都是二进制格式的协议。

在这里插入图片描述

​ HTTP的响应也是文本格式的,这里的二进制乱码是因为被压缩了。HTTP响应经常会被压缩,压缩之后体积变小,传输的时候可以节省网络带宽(服务器最贵的资源,就是网络带宽)。但同时,压缩和解压缩,需要消耗额外的CPU和时间。

在这里插入图片描述

点击淡黄色框。Click to decode,进行解压缩

在这里插入图片描述

​ 此时就可以看到之前的乱码被解压好了,响应的数据是一个html文件。浏览器上显示的网页(html),往往都是浏览器先请求对应的服务器,从服务器这边拿到的页面数据(html)

二、HTTP请求(Request)

1.首行:

在这里插入图片描述

在这里插入图片描述

HTTP请求的第一行,有三个部分信息,使用空格分隔。

1.GET : HTTP请求的“方法”(method)

2.URL (唯一资源定位符):描述了一个资源在网络上的位置

3.版本号:HTTP/1.1 当前最主流的版本。

1)方法(method)

GET 获取资源

POST 传输实体主体(登录、上传文件)

GET请求通常会把要传给服务器的数据,加到url的query string中

POST请求,通常会把要传给服务器的数据,加到body

各种不同的请求最初的未来表示不同的语义。但是如何使用不一定严格遵守。

GET和POST的区别(面试题)

1.没有本质区别,双方可以进行替换

2.使用习惯上存在差异:GET通常会把要传给服务器的数据,加到url的query string中POST放在body中。

3.语义上的差异:GET大多数用来获取数据,POST大多数用来提交数据(登录、上传等)

4.在早期硬件性能受限的情况下,会限制url的长度从而降低get的传输能力。但是现在的url已经可以很长,来满足需求。

5.GET虽然是显示信息的,但是并不意味着不安全,即使获取到也不容易破解加密

6.GET也可以在body中存放二进制信息。也可以把二进制的数据通过base64转码,放在url的query string中。

7.GET请求是幂等的,POST请求不是幂等的。实际上是否幂等取决于代码的实现。RFC标准文档建议GET请求实现成幂等的。

8.GET请求可以被浏览器缓存,POST不可以被缓存(幂等性的延续)

9.GET请求可以浏览器收藏夹收藏,POST不能(可能会丢失body)

幂等:输入相同的内容,输出是稳定的

2)URL

​ URL是计算机中非常重要的概念,不仅仅在HTTP中涉及到。在jdbc中设置数据源时:setUrl(“jdbc:mysql://127.0.0.1:3306/base?characterEncoding=utf8&useSSL = false”);这就是一个URL,URL(唯一资源定位符)描述了某个资源在网络上的所属位置。数据库同样也是一种资源。描述出数据库具体的位置。

在这里插入图片描述

  • 协议方案名 :http:// https://

  • 登录认证信息,现在几乎不会用到,尤其是针对用户的产品。

  • 服务器地址:可以是一个IP,也可以是域名。

  • 服务器端口号:通过IP地址只是描述了网络资源在哪个主机上,一个主机可能有很多服务器程序,使用端口号来进行区分是哪个程序。URL中是端口号,有时可以省略。对于http请求,端口号省略,默认访问80端口。对于https请求来说,端口号省略,默认访问443端口。

  • 带层次的文件路径:描述了要访问服务器的哪个资源。

    ​ 一个服务器提供的资源可能有很多。/dir/index.html虽然写法是目录的写法,只是用来区分当前资源的位置,在服务器上不一定是以目录的形式来存储资源的。(这个资源可能是硬盘的数据、内存的数据、通过网络访问其他服务器拿到的数据、通过CPU计算出来的一些数据)这个目录结构怎么写,和后续服务器代码的编写程序密切相关。

  • 查询字符串(query string):针对这次请求进行了一些补充说明。

    ​ ?uid = 1 :以?开头是一种键值对结构的数据,键值对&来分隔,键和值用=来分隔。一个url中的query string里可以包含N个键值对,可能会导致很长。query string中的键值对都是程序员自定义的,而header中的键值对是标准规定的。

    ​ 如果value部分要包含一些特殊符号的话,往往要进行urlencode操作。“+?:/…”这些字符在url中已经有特殊用途了。如果value中,也包含特殊字符,就可能会使浏览器/http服务器,对url的解析出现bug。C++ ->C%2B%2B。urlencode(本质上是一种转义字符)“+”的ascii码就是2B,在前面加上%表示这是转义的结果。汉字也需要进行转义。后续在使用url时要记得需要针对query string的内容进行urlencode操作,避免浏览器解析失败,导致请求无法正常进行。

  • 片段标识符:#ch1 有的网页内容比较长,就可以分成多个“片段”,通过片段标识符,就可以完成页面内部的跳转。(翻阅技术文档)

2.请求头(header):
  • 首行下面就是是请求头header。
  • 是一个键值对结构的数据,每个键值对都独占一行。都是属于“标准规定”的。键和值之间,使用 :+ 空格 来区分。
  • 使用空行,来作为请求头的结束标记。

在这里插入图片描述

1.HOST:

表示服务器主机的地址和端口,地址也在url中存在。在使用代理的时候,HOST的内容可能和url中的内容是不同的。

2.Content-Length

Content-Length:描述body中数据的长度。 Content-Type:描述body中数据的格式

出现这两个属性的前提是请求中有body,通常情况下GET请求没有body.POST请求有body

​ TCP涉及到粘包问题,HTTP在传输层就是基于TCP的。使用同一个TCP连接,传输多个HTTP数据包,此时就会使多个HTTP数据包在TCP接受缓冲区中挨在一起。接收方解析的时候,就需要能够清楚HTTP数据包之间的边界。对于GET这种没有body的请求,直接使用空行(分隔符)区分。对于POST这种有body的请求,结合空行和Content-Length区分

3.body中数据的格式:

请求:1.json ({ })2.form表单的格式 (相当于把GET的query string搬到body中)3.form-data的格式(上传文件)

响应:1.html 2.css 3.js 4.json 5.图片…

​ 后续给服务器提交的请求,不同的Content-Type,服务器处理的逻辑的不同的。浏览器也会对返回的不同Content-Type进行处理。

4.User-Agent(UA)

​ 描述了使用什么设备上网(操作系统版本、浏览器版本)。目前的浏览器差异很小,所以目前UA主要用来区分PC端和移动端。

5.Referer

​ 描述了当前页面是从哪个页面跳转来的。

​ 如果是直接在地址栏输入url(或者点击收藏夹)是没有Referer的

6.Cookie

​ 浏览器在本地存储数据的一种机制。

​ Cookie 中存储了一个字符串, 这个数据可能是客户端(网页)自行通过 JS 写入的, 也可能来自于服务器(服务器在HTTP 响应的 header 中通过 Set-Cookie 字段给浏览器返回数据).

​ 在浏览器存储临时数据(上次登录的时间、用户的身份信息、累计访问次数等)

​ 为了保证安全性,又能进行存储数据,于是就引入了Cookie(也是按照硬盘文件的方式保存,但是浏览器把操作文件封装了,网页只能往Cookie中存储 键值对->字符串)。Cookie存储在浏览器所在主机的硬盘上,并且按照域名为维度来存储。每个域名下可以存自己的Cookie,彼此互不影响。Cookie按照键值对和形式进行组织(键值对是由程序员自定义的和query string类似)后续再请求这个服务器的时候,就会把Cookie中的内容自动代入到请求中,再发给服务器。服务器再根据Cookie的内容进行处理。

3.正文(body):

有的HTTP请求有,有的没有。

三、HTTP响应

1.首行
  • 由三个部分组成。

在这里插入图片描述

1.版本号:HTTP/1.1

2.状态码 : 200 描述了请求的结果

​ 表示了这次请求对于的响应是什么状态(成功、失败、其他情况、对于的原因)

​ 2XX:2开头的都表示成功。

​ 3XX: 3开头的都表示重定向。302:临时重定向

​ 重定向:请求中访问的是A的地址,响应返回了一个重定向报文,告诉应该访问B地址。比如网页跳转、或者服务器迁移了

重定向的响应报文,会带有Location字段描述出当前要跳转到哪个新的地址。

​ 4XX:4开头表示请求错误。

​ 404:Not Found 请求中访问的资源,在服务器上不存在。

​ 403:Forbidden 表示访问的资源没有权限。

​ 418:I am a teapot! 是HTTP RFC文档中的彩蛋,并没有实际的含义。

​ 5XX: 5开头的表示服务器出错了。(服务器挂了) 500:写的代码有bug

总结:

1**:hold on 等一等,后面还有

2**:Here you go 你走对了

3**:Go away 去别处

4**:You fucked up 你出错了

5**:I fuckd up 我出错了

3.状态码描述:OK 对这个状态码做了进一步的解释。

2.响应头(header)
  • 首行下面的响应头,同样是键值对结构,每个键值对独占一行,一直到空行结束。

在这里插入图片描述

3.正文
  • 空行的下面,正文可能比较长,可能是多种格式。

四、如何让客户端构造一个HTTP请求

浏览器:

1.直接在浏览器地址栏输入url,构造一个GET请求。

2.特殊的html标签,可能会触发GET请求:img、a、link、script。

3.通过form表单来触发GET/POST请求。

浏览器对于html来说具有一定的鲁棒性(容错能力、即使写的不规范,也尽可能的进行解析)

    <form action="http://www.baidu.com/abc.html" method="get">
        
    </form>
  • action属性里写要访问请求的url路径是什么。
  • method属性描述了当前要构造的请求是get还是post(form只支持get和post)
        <form action="http://www.baidu.com/abc.html" method="get">
            <input type="text" name="key1">
            <input type="text" name="key2">
            <input type="text" name="key3">
            <input type="submit" value="提交">
            
        </form>
  • 输入框的内容就会被构造成http请求的query string

    query string是键值对形式的,key就是input输入框的name属性,value就是输入框中用户输入的内容

4.ajax的方式

​ form存在一些缺陷,1.只支持get和post,不支持其他方法。2.form会出触发页面跳转(有的时候不需要跳转)所以引进ajax。通过js提供的api来构造http请求。针对拿到的响应,可以使用js灵活进行处理。

​ 浏览器原生提供了ajax的api,不好用。一些第三方库,封装了ajax,使用第三方库封装好的ajax来进行操作

1.引入jquery库

<script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.7.1/jquery.min.js"></script>

2.编写代码

    <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.7.1/jquery.min.js"></script>
    <script>
        $.ajax({
            type: 'get',
            url: 'https://www.sogou.com/abc.html',
            success: function (body) {
                 console.log(body);
            }
        });
    </script>
  • $是一个变量名(在jquery中定义的全局变量),通过这个变量来调用一些方法,使用jquery中的api
  • js中{ } 表示对象。里面用键值对的方式来进行描述
  • success这个函数,不是立即执行的,而是服务器返回200这样的响应时,才会执行到success(回调函数)

5.通过第三方工具,图形化界面构造:postman

var settings = {
  "url": "https://www.sogou.com",
  "method": "POST",
  "timeout": 0,
  "headers": {
    "Content-Type": "application/json",
    "Cookie": "IPLOC=CN6101; SUID=09842E705EA7A20B00000000663A0247; cuid=AAEV1zYJTAAAAAuiptoeYwEAEAM=; ABTEST=0|1715077703|v17"
  },
  "data": JSON.stringify({
    "a": "100",
    "b": "200"
  }),
};

$.ajax(settings).done(function (response) {
  console.log(response);
});
  • 通过postman来生成js代码

点击移步博客主页,欢迎光临~

偷cyk的图

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

个人IP打造孵化运营产业链商业计划书

【干货资料持续更新&#xff0c;以防走丢】 个人IP打造孵化运营产业链商业计划书 部分资料预览 资料部分是网络整理&#xff0c;仅供学习参考。 PPT共90页&#xff08;完整资料包含以下内容&#xff09; 目录 个人IP运营方案&#xff1a; 1. 个人IP定位与构建 1.1 人格画像构…

2024五一档中国电影市场研究报告

来源&#xff1a;拓普数据 2024年五一档内地电影总票房15.27亿&#xff0c;同比增长0.38%&#xff0c;低于2021年的16.74亿&#xff0c;与2019年档期票房相当。日均大盘票房3.05亿&#xff0c;同比小幅增长0.4%&#xff0c;低于2018-2021年同期&#xff0c;位居档期影史第四。…

列表处理基础问题的四种方法:从入门到惊艳

目录 一、引言 二、方法一&#xff1a;基础循环遍历 三、方法二&#xff1a;列表推导式 四、方法三&#xff1a;内置函数与高阶函数 五、方法四&#xff1a;惊艳的库与工具 六、案例研究 七、总结 一、引言 在编程的世界中&#xff0c;列表&#xff08;List&#xff09…

Element-ui-vue3-前端界面开发-配置-编辑main.js-nodejs基础语法-vue3-html模板语法-vue文件编译

前端配置 1.下载nodejs 18 lts2.配置nodejs和安装vue3.vue调试技巧3.1.debugger3.2.vue devtools4.编辑main.js5.nodejs基础语法5.1.import5.1.1.导入单个模块或组件5.1.2.导入整个模块或库5.1.3.导入默认导出5.1.4.导入 css文件5.1.5.导入模块和组件5.2.export5.2.1.命名导出5…

第十五届蓝桥杯省赛大学B组(c++)

很幸运拿了辽宁赛区的省一,进入6月1号的国赛啦... 这篇文章主要对第十五届省赛大学B组(C)进行一次完整的复盘,这次省赛2道填空题6道编程题: A.握手问题 把握手情景看成矩阵: 粉色部分是7个不能互相捂手的情况 由于每个人只能和其他人捂手, 所以黑色情况是不算的 1和2握手2和…

SpringBoot 自定义 HandlerMethodArgumentResolver 搞定xml泛型参数解析

文章目录 介绍一、解析简单 xml 数据案例引入 Jackson 的 xml 支持定义 Message 对象&MessageHeader 对象定义 Controller 方法调用结果 二、解析带泛型的 XML 数据案例2.1 直接给 Message 加上泛型 T2.2 无法直接解析泛型参数了 三、自定义 MVC 的参数解析器实现泛型参数解…

智能BI平台(后端)-- 项目介绍

文章目录 项目介绍需求分析基础架构图优化架构图技术栈 开个新坑&#xff0c;预计时间不会很长 项目介绍 BI商业智能&#xff1a;数据可视化&#xff0c;报表可视化系统 主流BI&#xff1a;帆软BI&#xff0c;小马BI&#xff0c;微软 Power BI 传统BI&#xff1a;[查看传统 BI…

精益生产咨询公司在企业转型中发挥的作用有哪些?

在全球化竞争日益激烈的今天&#xff0c;企业转型已成为许多组织求生存、谋发展的必经之路。而在这条道路上&#xff0c;精益生产咨询公司的作用愈发凸显&#xff0c;它们如同企业转型的得力助手&#xff0c;帮助企业在复杂的商业环境中找到新的增长点&#xff0c;实现更高效、…

I forgot my Plex Account PIN; how can I reset it? How can I change my PIN?

If you’ve set a PIN on your Plex account, it’s possible to reset or remove that PIN. Related Page: Plex Home Regular Plex Account If you know the current PIN If the current PIN is known, then simply edit the current PIN on the Settings > Users &…

Cisco NX-OS System Software - ACI 16.0(5h)

Cisco NX-OS System Software - ACI 16.0(5h) 适用于 ACI 模式下的 Cisco Nexus 9000 系列交换机 请访问原文链接&#xff1a;Cisco NX-OS System Software - ACI 16.0(5h)&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xff1a;sysin.org Cis…

从零开始的软件测试学习之旅(七)接口测试流程及原则案例

接口测试三要素及案例 接口测试介绍接口预定义接口测试的主要作用测试接口流程如下接口测试三要素接口测试分类RESTful架构风格RESTful架构三要素要素一要素二要素三 RESTful架构风格实现restful架构案例接口测试流程接口测试原则功能测试自动化测性能测试 复习复盘 接口测试介…

AI视频教程下载:学会用AI创作文本图片音频视频

在不断发展的科技领域&#xff0c;人工智能 (AI) 是毋庸置疑的冠军&#xff0c;它是一种不断创新的力量&#xff0c;在我们的生活中扮演着越来越重要的角色。随着 2023 年的到来&#xff0c;我们诚挚地欢迎您加入人工智能精通课程的大门。 这不仅仅是一个课程&#xff0c;它专为…

外网访问内网电脑?

随着互联网的发展&#xff0c;越来越多的人需要在不同地区间进行远程访问和组网。而在复杂网络环境下&#xff0c;外网访问内网电脑常常成为一个令人头痛的问题。现在有一款名为【天联】的组网产品却解决了这个难题。 【天联】组网是由北京金万维科技有限公司自主研发的一款内网…

【管理篇】管理三步曲:任务执行(三)

目录标题 多任务并行如何应对?如何确保项目有效的执行项目执行过程中常见的问题1、目标不明确2、责任不明确3、流程不健全4、沟通不到位 如何有效执行任务 如何让流程机制有效的执行 研究任务管理&#xff0c;就是为了把事情做出来&#xff0c;产出实实在在的业绩和成果&#…

京东物流:表格技术在物流行业的敏捷应用实践

“物流大促期间&#xff0c;在出库单量积压的场景下&#xff0c;不同仓的生产操作人员需要在统一数据源的基础上进行基于自身仓情况的个性化查询分析&#xff0c;从而能够实时监控客单情况&#xff0c;防止积压。要想实现这样的功能&#xff0c;对数据分析平台的要求就非常高。…

通过 Java 操作 redis -- 基本通用命令

目录 使用 String 类型的 get 和 set 方法 使用通用命令 exists &#xff0c;del 使用通用命令 keys 使用通用命令 expire,ttl 使用通用命令 type 要想通过 Java 操作 redis&#xff0c;首先要连接上 redis 服务器&#xff0c;推荐看通过 Java 操作 redis -- 连接 redis 关…

深入探索van Emde Boas树:原理、操作与C语言实现

van Emde Boas (vEB) 树是一种高效的数据结构&#xff0c;用于处理整数集合。它是由荷兰计算机科学家Jan van Emde Boas在1977年提出的。vEB树在处理整数集合的查找、插入、删除和迭代操作时&#xff0c;能够以接近最优的时间复杂度运行。vEB树特别适合于那些元素数量在某个较小…

CSS引用

CSS定义 层叠样式表&#xff1a;&#xff08;Cascading Style Sheets,缩写为css&#xff09;,是一种样式表语言&#xff0c;用来描述HTML文档的呈现&#xff08;美化内容&#xff09; 书写位置&#xff1a;title标签下方添加style双标签&#xff0c;style标签里写入CSS代码 在s…

Spring Security 入门1

1. 概述 基本上&#xff0c;在所有的开发的系统中&#xff0c;都必须做认证(authentication)和授权(authorization)&#xff0c;以保证系统的安全性。 authentication [ɔ,θɛntɪ’keʃən] 认证 authorization [,ɔθərɪ’zeʃən] 授权 以论坛举例子&#xff1a; 【认证…

Covalent引入五个新网络运营商,提升去中心化特性和数据安全性

为了进一步扩大运营商基础以并践行去中心化网络基础设施的宗旨&#xff0c;Covalent Network&#xff08;CQT&#xff09;在网络中引入了五个新的区块样本生产者&#xff08;BSPs&#xff09;角色。该举措不仅重申了 Covalent Network&#xff08;CQT&#xff09;对社区驱动协议…