【网络原理8】HTTP请求篇

news/2024/4/20 8:29:23/文章来源:https://blog.csdn.net/weixin_56738054/article/details/129180661

  在上一篇文章当中,我们也提到了什么是HTTP。

  每一个HTTP请求,都会对应一个HTTP响应。

  下面这一篇文章,将聊一下HTTP请求的一些内容

目录

一、URL

第一部分:协议名称

第二部分:认证信息(新的版本已经没有了)

第三部分:服务器地址+(端口号)

第四部分:带层次的文件路径

第五部分:查询字符串

第六部分:片段标识符

二、URL encode/decode

     为什么要使用url encode

      一个转义的例子:

     转义的规则:

三、HTTP的请求方法

get和post的区别

在当下的场景当中,get和post没有本质的区别,是可以相互替换的。

区别1: 语义上面的区别

      区别2:通常情况下get没有body部分,而post有body部分   

      区别3:Get请求一般是幂等的,POST请求一般不是幂等的

       区别4:GET可以被缓存,POST不可以被缓存

四、HTTP请求头(request)数据包的一些常见的"键值对"

①host:描述了请求资源的主机地址&端口号​编辑

②Content-Length&Content-Type;这两个键值对

Content-Type的各种取值

       取值1:application/x-www-form-urlencoded:form

    取值2:multipart/form-data:form

     取值3:application/json

关于Content-length

③User-Agent

④Referer:描述了当前的页面,是从哪里跳转过来的 

五、cookie

引入cookie

cookie具体的组织形式

步骤1:按照访问网站的域名来组织。

步骤2:每一个域名对应的一组cookie当中,又会按照键值对来组织数据

六、session


一、URL

URL的含义就是"网络上唯一资源的地址符"。

通过浏览器,打开网页的时候,地址栏里面填写这个网址,就是URL。

 通过这个URL。既可以明确主机是谁,又可以明确访问的是主机上面的什么资源。

 下面,说明一下一个URL被分为了哪几个部分。


第一部分:协议名称

       

       https/http:这一部分,描述了当前的这一个网络地址,是给http用的,还是给https用的。

       如果显示的是http,那么就是给http这一个协议使用的。如果显示的是https,那就是给https这一个协议使用的。


第二部分:认证信息(新的版本已经没有了)

 显示的是当前用户登录的登录信息(可能是用户名/密码)


第三部分:服务器地址+(端口号)

当前需要访问的主机是哪一个。可能是一串字符,也有可能是1.2.3.4这样的ip地址。

如下图,显示的就是一个域名地址。

如果显示了端口号,那这一个端口就是http请求需要访问的端口。

 但是,可以看到:一般情况下,都没有显示端口号,这是怎么回事呢?

 没有显示端口号,并不代表没有端口号。

 对于没有在URL地址当中显示端口号的情况:

 如果使用的是http协议,那么默认是80端口

 如果使用的是https协议,那么默认值就会是443端口


第四部分:带层次的文件路径

     描述了当前服务器需要访问的资源是什么。

  对于这一个带有层次的文件路径,有可能是一个真实的文件的路径

  也有可能是虚拟的,由服务器代码,构造出的一个动态的数据

       单凭:ip地址/域名地址+文件路径已经可以锁定网络上面的某一个地址了,但是,还有一部分,那就是查询字符串


第五部分:查询字符串

查询字符串,可以有一组,也可以有多组。

每一组都是使用键值对来表示的,键和值之间用"="来连接。

但是组与组之间,使用的是"&"来连接的。

但是,这些字符串的具体含义,那就是由web开发的程序员来决定的了。 


第六部分:片段标识符

本质上是希望访问的具体的html页面的哪一个子部分。可以理解为:跳转到某一个章节的部分。(此部分可能有,也可能没有)


总览一下http的URL的结构:

其中:文件资源(文件目录)和查询字符串部分,是后续web开发常用的


二、URL encode/decode

     为什么要使用url encode

       当输入的查询字符串当中,如果出现了特殊的符号,例如?或者/或者++等等的符号的时候,为了避免歧义。于是就需要对于这些特殊的字符进行转义。

       观察如下的一个URL:

        

       此时,可以看到type是blog。如果一个客户在type的等号后面输入了:b&o=log,也就是变成了这样:

       

        这样,也就产生了歧义。究竟是type这个参数的值是"=b&o=log",还是两个参数,一个参数是type,另外一个参数是o呢?

        于是,就涉及到了http encode,它会把用户输入的存在歧义的字符串给转义掉。


      一个转义的例子:

        下面,举一个转义的例子:

         如果在百度搜索引擎当中输入了"C++",可以查看一下搜索栏的内容:

       可以看到,搜索的两个加号,被替换为了"%2B"。


     转义的规则:

       查一下"+"对应的ascii码值:2B

       因此,转义的规则就是让对应的字符转化为16进制,也就是ascii码,然后再加上"%"。这样就完成了转义了。

        URL的decode,就是上述过程的逆向。当遇到了%+字符串的时候,就把它们转化为对应的字符。


三、HTTP的请求方法

在http请求头当中,包含了一个属性,那就是http方法:

这一个方法有许多,但是最常用的,还是两个:一个是get,另外一个是post

方法用处支持的版本
post传输实体1.0&1.1
get获取资源1.0&1.1

       HTTP当中引入了的这一些方法的初衷,也是为了表示不同的"语义"。

       但是,实际开发的场景当中,这些方法的用处也没有区分地这么明确。很多时候,GET方法也可以传输实体,POST方法也可以获取资源...

       但是,二者的区别究竟在哪里呢?


get和post的区别

在当下的场景当中,get和post没有本质的区别,是可以相互替换的。

       但是,仍然在细节上面,存在一些区别:对照一下get和post不同的抓包方式,比较一下它们的区别。


区别1: 语义上面的区别

方法用处支持的版本
post传输实体1.0&1.1
get获取资源1.0&1.1

      get方法一般用于获取资源,而post方法一般用于传输实体。 但是现在这个区别已经不那么清晰了。

       例如,用户登录这个功能,一般使用的就是post请求。向服务器提交userName和password两个字段,登录成功之后跳转页面。        


     查询商品列表这个功能,一般使用的就是get请求

     来获取商品列表这一系列的资源。


      区别2:通常情况下get没有body部分,而post有body部分   

       对比一下使用Fiddler抓包的情况  ​

通常情况下: 

   get没有body的,它一般通过query string(查询字符串)来服务器传递数据。

   post有body的,post通过body向服务器传递数据

       上述情况,一般情况下都是成立的。但是,偶尔也会出现post没有body,但是get有body的情况。或者post有查询字符串,但是get没有查询字符串的情况。

        其次:一部分公司在实际开发当中,有时候会硬性规定一定要使用post请求来处理。那这样肯定post也会有不带body的情况。


      区别3:Get请求一般是幂等的,POST请求一般不是幂等的

       这个区别也不是强制性的。

       幂等&不幂等:

       每次相同的输入,得到的输出结果是确定的,那么就说这个请求是幂等的。

       每次相同的输入,得到的输出结果是不确定的,那么就说这个请求是不幂等的。


       区别4:GET可以被缓存,POST不可以被缓存

        能否缓存,其实和能否幂等是有密切关系的。

        如果请求类型是幂等的,那么请求就是可以缓存的。

        如果请求类型是不幂等的,那么请求就是不可以缓存的。

       案例1:例如像查询百度热搜榜这样的请求,由于百度热搜榜实时更新比较快速的,那么就不是幂等的,也就不需要缓存。 

       案例2:还有,类似于广告搜索这样的请求,虽然是get请求(获取数据的),但是,它的要求一定是不可以缓存的。因为如果缓存的话,用户多次搜索同一个关键字,看到的仍然是一组/一个广告,这样是没有意义的。


       总结一下:GET与POST的区别

方法GETPOST
语义通过查询字符串获取内容向服务器提交实体
有无body通常无通常有
是否幂等通常是通常否
是否可以被缓存通常可以通常不可以

四、HTTP请求头(request)数据包的一些常见的"键值对"

      在这一篇文章当中,我们提到了HTTP请求是由HTTP请求行+HTTP请求头+body构成的。
【网络原理7】认识HTTP_革凡成圣211的博客-CSDN博客HTTP抓包,Fiddler的使用https://blog.csdn.net/weixin_56738054/article/details/129148515?spm=1001.2014.3001.5502

      HTTP请求头是由多个键值对构成的,下面,将聊一下HTTP请求头当中有哪些常见的键值对。


①host:描述了请求资源的主机地址&端口号

      这是一个使用Fidller抓包后看到的数据。关于怎样使用Fidller抓包,也已经在上一篇文章当中提到了 

      如上图,看到的域名是bizapi.csdn.net。

      但是,这一个地址可以被DNS解析为一个确定的ip地址,也就是类似于1.2.3.4这样的IP地址。


②Content-Length&Content-Type;这两个键值对

       这两个属性是在描述请求头当中body部分的属性。如果一个HTTP请求有body,那么这两个键值对才会在HTTP请求头当中出现。

 下面,来聊一下一个登陆的案例:

  当用户提交了userName(用户名)和password(密码)之后,就可以正常登录了。

 但是,可以看到,提交并且跳转页面的时候,并没有在url地址栏显示userName和password

           这也就说明,这个网站很有可能是使用post请求提交的,把用户名和密码封装到一个实体当中。

        也就是post请求的body部分

        但是,在早期的网站当中,很多时候是使用get请求提交的,那么就意味着提交的内容(userName,password)都是可以显示在url地址栏当中的,这样给人感觉就很不安全


Content-Type的各种取值

       Content-Type所表示的含义,其实就是body当中数据的表示格式。

       取值1:application/x-www-form-urlencoded:form

           这一种取值,说明是通过表单form来进行提交。

       我们常见的:url当中经常使用param1=aaa&param2=bbb这种使用queryString的方

,body的取值就是这样的。


    取值2:multipart/form-data:form

      

    当使用这种格式的时候,需要在form表单后面新增一个属性:enctype="multipart/form-data"。

    这一种格式通常用来提交图片/文件的内容。


     取值3:application/json

     关于这一个取值,其实就是向服务器提交json格式的字符串。


关于Content-length

       其实,Content-length的值,是对于有body的HTTP请求当中,约定读取多少个字节的body来设定的。

       也就是在空行之后的body部分读取多少内容


③User-Agent

表示当前用户使用的是一个什么样的设备来上网。

主要就是两部分内容:操作系统信息+浏览器信息

操作系统信息:括号里面的内容(Windows NT 10.0; WOW64)

代表了两个含义:

当前的windows版本为10,电脑是64位的系统。 

浏览器信息:

上图显示的是Chrome浏览器。


       但是,当前的互联网时代,可能User-Agent可能更大的作用就是区分PC端(电脑打开的

浏览器页面)还是手机端。为了返回一个合适的页面


④Referer:描述了当前的页面,是从哪里跳转过来的 

       如果当前这个页面,是由其他页面的超链接等等跳转过来的,那么就会有这一个字段,显示跳转之前的页面。

       下面,通过一个例子,来讲解一下这个字段的重要性:


        我们都知道,互联网很大一部分的收入都来自于广告的收益。下面,打开360浏览器,然后输入"旅游":

        

       可以看到,这一个页面上面,呈现了大量的url地址。如果细心一点,可以发现这些地址的下面都有不太明显的"广告"二字。这些广告商,在浏览器上面刊登自己的页面,是需要给浏览器费用的。

       怎么个收费法呢?

       那就是按照点击的次数来计费。只要有用户点击其中一个url,那么就会记录点击的次数。最后,广告商根据这个点击次数来付给浏览器钱。用户点击一次,浏览器可能收几块钱,也有可能几十/几百元。


       但是,这些广告商,不一定仅仅只在一个平台上面发布自己的广告信息。它有可能在多个平台上面发布信息。

       这个时候,Refere字段就发挥了作用了,它可以让广告商知道是哪一个平台跳转过来的。从而付给对应的平台钱。


       但是,仍然有一个存在问题,那就是,如果运营商把Refere字段给改动了,这样,岂不是会造成刊登广告的平台的经济损失?(ps:只有运营商,也就是卖路由器的那些公司,才有这个能力改动)

       以上这种情况,在过去非常地猖獗,并且牵扯了很多法律问题。那么,如何避免黑心的运营商进行篡改HTTP的内容呢?下一篇文章,将会讲一下HTTPS


五、cookie

引入cookie

为了安全,浏览器在一般情况下面,不允许让页面上面的js访问用户电脑上面的文件系统的。

但是这样的安全机制,也带来了一定的麻烦。有时候,如果确实需要在页面上面存储一些数据,方便后续的访问呢?

例如:用户登录之后,登录状态需要保存到一个特定的地方。后续,当前用户如果需要访问这个网站的其他页面的时候,服务器就可以识别了。

虽然有上面的安全机制保证。但是,其实可以让页面的js访问一个磁盘的指定空间。

这个指定的空间有很多种,但是最常见的一种就是cookie.

cookie:浏览器提供给页面的一种持久化数据的机制。这个数据不会因为程序的重启/主机重启而丢失。

       其中,cookie的数据是存储到用户的磁盘当中的一个特定的位置。也就是谁访问这个网站,那么cookie就会存在谁的磁盘当中。


cookie具体的组织形式

步骤1:按照访问网站的域名来组织。

针对每一个域名,浏览器都会分配一组cookie

例如访问www.baidu.com的时候,就会给www.baidu.com分配一组cookie。

当访问www.sogou.com的时候,就会给www.sogou.com分配一组cookie。


步骤2:每一个域名对应的一组cookie当中,又会按照键值对来组织数据

可以这样查看当前浏览器下面的cookie:

 这一些键值对,就是cookie来组织的。


六、session

       对于cookie,它们大部分都是把信息存放到用户的服务器上面的。因此,也就非常容易丢失。甚至用户可以点开cookie手动进行删除。并且数据量一旦大起来,那么非常不好管理

       因此,引入了第二种方式来存储一些用户的信息,那就是session

       把真实的用户信息,存储到浏览器所在的服务器当中。

       然后对于用户一方,仅仅存储身份标识。当需要查询用户信息的时候,直接根据用户的身份标识,然后去浏览器查询就可以了。

但是,实际开发当中,cookie和session很多时候都是一起配合使用的。

下面,我们使用Fidler抓包,看一下cookie当中的数据(HTTP请求)

       可以看到,在这一个cookie信息当中,有一个gitee-session-n 这样的字段

       这一个字段,就很可能是用户的sessionID。(但是不一定绝对是)

       cookie把用户的sessionID存储到用户的磁盘当中。当用户访问的时候,就根据这个sessionId查询浏览器的session的具体内容(例如用户的登录状态)。

       关于cookie和session的内容,会在后面的servlet部分详细讲一下在代码当中是如何实现的。

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

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

相关文章

【数通网络交换基础梳理1】二层交换机、以太网帧、MAC地址详解及数据帧转发原理(爆炸细)

一、网络模型 万年不变,先从模型结构分析,现在大家熟知的网络模型有两种。第一种是,OSI七层模型,第二种是TCP/IP模型。在实际运用中,参考更多的是TCP/IP模型。 OSI七层模型 TCP/IP模型 不需要全部理解,…

Spring MVC 源码- HandlerExceptionResolver 组件

HandlerExceptionResolver 组件HandlerExceptionResolver 组件,处理器异常解析器,将处理器( handler )执行时发生的异常(也就是处理请求,执行方法的过程中)解析(转换)成对…

Python变量的定义和使用

定义:变量就是计算机内存中存储某些数据的位置的名称 形象理解变量就是一个存放东西的容器,该容器的名字就叫做变量,容器存放的东西就是变量的值 变量的组成: 标识:标识对象所储存的内存地址,使用内置函数i…

六千字让你明白什么是数字孪生?

文章目录1. 背景2. 数字孪生基础2.1 概念2.2 价值3. 技术生态3.1 技术体系3.2 核心技术3.2.1 多领域、多尺度融合建模3.2.2 数据驱动与物理模型融合的状态评估3.2.3 数据采集和传输3.2.4 全生命周期数据管理3.2.5 虚拟现实呈现3.2.6 高性能计算3.3 建设3.3.1 重点3.3.1.1 数字孪…

SEATA是什么?它的四种分布式事务模式

一、SEATA是什么? Seata 是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务。Seata 将为用户提供了 AT、TCC、SAGA 和 XA 事务模式,为用户打造一站式的分布式解决方案。 在继续学习使用SEATA之前,对s…

数据结构栈的经典OJ题【leetcode最小栈问题大剖析】【leetcode有效的括号问题大剖析】

目录 0.前言 1.最小栈 1.1 原题展示 1.2 思路分析 1.2.1 场景引入 1.2.2 思路 1.3 代码实现 1.3.1 最小栈的删除 1.3.2 最小栈的插入 1.3.3 获取栈顶元素 1.3.4 获取当前栈的最小值 2. 有效的括号 0.前言 本篇博客已经把两个关于栈的OJ题分块,可以根据目…

【华为OD机试模拟题】用 C++ 实现 - 分糖果(2023.Q1)

最近更新的博客 华为OD机试 - 入栈出栈(C++) | 附带编码思路 【2023】 华为OD机试 - 箱子之形摆放(C++) | 附带编码思路 【2023】 华为OD机试 - 简易内存池 2(C++) | 附带编码思路 【2023】 华为OD机试 - 第 N 个排列(C++) | 附带编码思路 【2023】 华为OD机试 - 考古…

Jina 3.14 版本发布!支持独立部署Executor

Jina 是一个 MLOps 框架,赋能开发者在云上构建多模态、跨模态的应用程序。Jina 能够将 PoC 提升为生产就绪服务。基础设施的复杂性交给 Jina,开发者能够直接轻松使用高级解决方案和云原生技术。🌟 GitHubhttps://github.com/jina-ai/jina/rel…

基于博客系统的测试用例

登陆界面博客预览页博客详情页博客编辑页

【华为OD机试模拟题】用 C++ 实现 - 时间格式化(2023.Q1)

最近更新的博客 华为OD机试 - 入栈出栈(C++) | 附带编码思路 【2023】 华为OD机试 - 箱子之形摆放(C++) | 附带编码思路 【2023】 华为OD机试 - 简易内存池 2(C++) | 附带编码思路 【2023】 华为OD机试 - 第 N 个排列(C++) | 附带编码思路 【2023】 华为OD机试 - 考古…

【华为OD机试模拟题】用 C++ 实现 - 最多获得的短信条数(2023.Q1)

最近更新的博客 【华为OD机试模拟题】用 C++ 实现 - 分积木(2023.Q1) 【华为OD机试模拟题】用 C++ 实现 - 吃火锅(2023.Q1) 【华为OD机试模拟题】用 C++ 实现 - RSA 加密算法(2023.Q1) 【华为OD机试模拟题】用 C++ 实现 - 构成的正方形数量(2023.Q1) 【华为OD机试模拟…

MATLAB绘制雷达图/蜘蛛图

雷达图/蜘蛛图 1 方法一 函数来源为MATLAB | 如何使用MATLAB绘制雷达图(蜘蛛图) 1.1 调用函数 1.2 案例 2 方法二 函数来源为MATLAB帮助-spider_plot 2.1 调用函数 语法(Syntax): spider_plot(P)spider_plot(P, Name, Value, ...)h …

内网穿透常用方法系列总结

前言在内网渗透时,一个WebShell或CobaltStrike、Metasploit上线等,只是开端,更多是要内网横向移动,扩大战果,打到核心区域。但后渗透的前提是需要搭建一条通向内网的“专属通道”,才能进一步攻击。可实战中…

中国ETC行业市场规模及未来发展趋势

中国ETC行业市场规模及未来发展趋势编辑根据市场调研在线网发布的2023-2029年中国ETC行业发展策略分析及战略咨询研究报告分析:随着政府坚持实施绿色出行政策,ETC行业也受到了极大的支持。根据中国智能交通协会统计,2017年中国ETC行业市场规模…

高端装备的AC主轴头结构

加工机器人的AC主轴头和位置相关动力学特性1. 位置依赖动态特性及其复杂性2. AC主轴头2.1 常见主轴头摆角结构2.2 摆动机构3. 加装AC主轴头的作用和局限性4. 切削机器人的减速器类型5. 其他并联结构形式参考文献资料1. 位置依赖动态特性及其复杂性 However, FRF measurements …

【华为OD机试模拟题】用 C++ 实现 - 求解连续数列(2023.Q1)

最近更新的博客 【华为OD机试模拟题】用 C++ 实现 - 分积木(2023.Q1) 【华为OD机试模拟题】用 C++ 实现 - 吃火锅(2023.Q1) 【华为OD机试模拟题】用 C++ 实现 - RSA 加密算法(2023.Q1) 【华为OD机试模拟题】用 C++ 实现 - 构成的正方形数量(2023.Q1) 【华为OD机试模拟…

【异常】导出Excel异常This archive contains unclosed entries.

一、异常说明 二、定位问题代码 一看问题, 上下文都是与订单相关的内容。 查询代码的使用地方,发现出现在这个Mybatis的select语句中 查看备注,发现是订单物流,那就没跑了, 肯定是商城的物流模块出了问题 那是什么地…

Gin获取Response Body引发的OOM

有轮子尽量用轮子 😭 😭 😭 😭 😭 😭 我们在开发中基于Gin开发了一个Api网关,但上线后发现内存会在短时间内暴涨,然后被OOM kill掉。具体内存走势如下图: 放大其中一次 在…

软件测试之测试模型

软件测试的发展 1960年代是调试时期(测试即调试) 1960年 - 1978年 论证时期(软件测试是验证软件是正确的)和 1979年 - 1982年 破坏性测试时期(为了发现错误而执行程序的过程) 1983年起,软件测…

springboot+vue.js协同过滤算法之智能旅游推荐系统java

目 录 第一章 绪论 3 1.1课题背景 3 1.2课题研究的目的和意义 3 1.3 研究现状 4 1.4论文所做的主要工作 4 第二章 技术介绍 5 2.1B/S结构 5 2.2MySQL 介绍 5 2.3MySQL环境配置 6 第三章 系统分析与设计 8 3.1系统说明 8 3.2系统可行性分析…