#网络安全在我身边##职场面试#
经过这一段时间的学习,我们已经学习了HTTP的基础知识。今天,小唐将会带领大家正式的开始学习有关HTTP的知识。
在之前的文章,小唐告诉了大家HTTP通信包括HTTP请求和HTTP响应,并且也告诉了大家两台主机在进行HTTP通信的时候,通信的内容可以通过HTTP请求报文和HTTP响应报文来分析。
在接下来的一段时间,我们来聊聊HTTP请求。
在HTTP请求中,包含了客户端要对服务器所请求的内容和请求的信息,不管是内容还是信息,都是我们HTTP请求的基础。严格意义上来讲HTTP请求报文的每一个部分都有着其特定的含义。
HTTP请求报文由请求头、请求首部和请求实体三个主要部分组成,如下图:
![e97d44347747eedc1dae15dc5c84c1cd.png](https://i-blog.csdnimg.cn/blog_migrate/e723d701615b038cbbf599efd51d4387.jpeg)
HTTP请求报文组成
什么是请求头?
请求头是HTTP头的一种,可以在HTTP请求中使用。用来对HTTP的请求做一个详细的描述,并且要确保这样的HTTP请求能够让服务端返回正确的响应。简单的讲,请求头就像是某一篇议论文的第一段,起着概括性的描述的作用。
什么是请求首部?
请求首部是为了确保对HTTP请求有着更加详细的描述。用于告诉服务器是谁或什么在发送请求、请求的来源在哪里等信息。因此服务器可以根据请求首部给出的客户端信息来给客户端提供更好的响应。我们可以这样来理解,如果我们的HTTP请求头作为一个大纲性的指导,那么,HTTP请求首部就是对这个大纲更进一步的描述。当规定了指导性的大纲后,也作出了具体的规划。接下来我们就需要根据大纲和规范的指导,开始把请求数据正式的发送给服务器了,这就是请求实体的作用。
什么是请求实体?
简而言之,请求实体就是我们要传输的数据了。因为,请求头规定了大体的方向,请求首部告诉了我们客户端要把请求发出去具体要怎么做,还少了一部分请求需要把什么内容发出去,而这一个缺少的部分就是通过请求实体来实现的。
简单的一句话理解就是请求头规定了方向,请求首部落实了细节,请求实体负责具体的实施。这三者之间的关系十分密切也是缺一不可的。
随着互联网的发展,人们觉得对于HTTP报文的请求头、请求首部和请求实体的定义太过于抽象。因此,又把HTTP请求报文的这三部分内容做了一个更加详细的划分,充分利用了分层的“分而治之”的思想。
人们把HTTP报文的请求头划分为了请求方法、请求URI和协议版本三个部分;把请求首部又划分出了许多有意义的字段,而请求实体本来就是一起的,把抽象的HTTP请求具体化了,因此我们可以画出如下的更加具体的HTTP请求报文图了:
![aff77db2010c71a3f6a6cb3e4c9234b1.png](https://i-blog.csdnimg.cn/blog_migrate/905786d6136c9286d5490c40a1980ec6.jpeg)
HTTP请求报文结构
在接下来关于HTTP请求报文的学习,就会围绕HTTP请求报文的结构来学习。
请求方法
一、什么是请求方法?
对于请求方法的最简单理解就是告知服务器的请求意图以及用什么方式去请求。在HTTP/1.1中规定了八大请求方法。
二、什么是请求URI?
要想理解请求URI是什么,首先我们得理解什么是URI,为了方便大家的理解,小唐给大家举一个简单的例子,在你的面前,有着许多的盒子,每一个盒子都有一个唯一表示盒子所在位置的符号用来告诉你需要去哪里找这些盒子,大概意思就是盒子的位置是唯一的,我们可以通过定位的方式查找盒子所在的位置。那么,在广阔的互联网中,有着很多的互联网资源,不同的资源在互联中的位置都是唯一的。如果人们想要在互联网中寻找某一个资源,那么,就一定会在互联网中找到一个唯一用来定位互联网资源的方法,这就是URI。URI在计算机领域叫做统一资源定位符,也就是小唐说的那一个唯一表示位置的的符号。
如果人们想要访问互联网的资源,他一定不是随便访问的,因为人们知道所要寻找什么样的互联网资源,因此人们也知道这些资源在互联网中的URI。所以如果想要访问指定的互联网资源,我们只需要找到这个资源的URI就行了,这样的过程就叫做请求URI。
那么,请求URI在什么位置可以找到呢,如果你是仔细的并且在访问网站的时候你也留意过网站的域名变化,你一定遇到过这样的格式:
![057b51b7ab529066f9ea50a6f4a24fea.png](https://i-blog.csdnimg.cn/blog_migrate/2962130d4ae4f8dadb76f53a581e3441.jpeg)
找一找请求URI
如果你仔细的观察就会发现这样的地址由两个部分组成,第一个部分是:http://www.xxx.com/ddd/search.php,第二个部分是?name=xiaotang&age=22。
第一个部分表示的是一个查询页面,第二个部分表示的是通过什么条件去查询,这两个部分组合起来就是一个根据姓名和年龄查询的功能页面了。第二个部分又叫做查询字符串。如果你还记得最开始学习的域名基础的话,你也许还能把第一部分的内容进行更加详细的划分,比如:http://www.xxx.com是域名,那么/ddd/search.php是什么呢?这就是请求URI。在互联网中,我们通常把域名和查询字符串之间的那一个部分叫做请求URI。
三、请求方法都有哪些?
上文中,小唐提到了HTTP/1.1规定的用于表示请求的八大方法,接下来小唐会把这八大请求方法,做一个简短的介绍,之后会拿出在生活和工作中经常用到的请求方法给大家一个详细的讲解。我们来看一看有哪些请求方法吧。
1、八大请求方法概览:
- (1)GET方法:用来获取服务器上的指定资源
- (2)POST方法:可以把数据抛给服务器处理
- (3)PUT方法:用来给服务器传输文件
- (4)HEAD方法:用来获取报文首部
- (5)DELETE方法:用来删除服务器上的文件
- (6)OPTIONS方法:用来询问服务器上的某一个URI资源支持那些请求方法
- (7)TRACE方法:可以用来查看客户端发送出去的请求是怎样被加工修改/篡改的
- (8)CONNECT方法:要求在于代理服务器通信的时候建立隧道,实现用隧道协议进行TCP通信。主要使用SSL和TLS协议把通信内容加密后经过网络隧道进行传输。在对CONNECT方法的学习、SSL/TLS协议的学习,在之后的HTTPS讲解,小唐会逐渐介绍给大家,不要着急奥。
四、日常生活中常见的请求方法有哪些?
在工作中或者生活中常用的方法主要有GET方法、POST方法、OPTIONS方法。
1、GET方法
GET方法是用来获取服务器上已经被URI识别的Web资源的。表示请求访问的指定资源经服务器解析后返回响应内容。简单的讲,如果客户端请求访问的资源是文本,服务器通过对请求的处理后,就会把这个资源保持原样的返回给客户端。如果客户端请求访问的是一个服务器的应用的计算功能的话,那么服务器就会把计算后的结果返回。
举个简单的例子,我们有着这样一个HTTP请求报文:
![9faf81a361b652d94326e0a9e0cb4e57.png](https://i-blog.csdnimg.cn/blog_migrate/943796fb3fafa03093e1bb9607a620f9.jpeg)
HTTP请求报文1
如上图,客户端对服务器发起了一个请求,其中请求的方法是GET,请求的URI是/index.html,用的是HTTP协议1.1版本的规范,并且通过首部指明了请求的服务器主机为www.example.com,此时,如果服务器收到了这样的请求就会返回一个指定的资源。大白话理解就是,客户端想访问www.example.com的网站服务器的index.html资源,然后服务器把这个资源返回给客户端。
再举一个例子,假设网站服务器上有一个查询页面的Web资源,我们把它叫做search.php页面,这个页面的主要功能是可以根据姓名和年龄来查询信息,那么,客户端想要想要请求服务器的查询功能的时候就会产生这样一个请求报文:
![f8ab5a39774ee10852a23bd8e8dcb7aa.png](https://i-blog.csdnimg.cn/blog_migrate/ae1e440635ae79160cbf912c10e51f29.jpeg)
HTTP请求报文2
这个时候服务器收到这样的请求就会把相应的结果返回给客户端了。
2、POST方法
主要是用来传输请求主体的内容的,有着和GET方法同样的作用,比如GET方法中的请求报文2这张图,POST方法主要经常用于在网页中有进行数据交互的表格。可以想象这样一个页面,在页面中有着两个输入框,一个是用来输入姓名的,一个是用来输入年龄的,还有一个查询按钮,点击查询按钮后,我们可以获取查询后的结果,如果客户端要获取这样一个查询页面的查询结果,就需要使用到POST方法了,因此POST方法就是一个把数据发送给服务器处理的过程。使用POST方法会产生类似于下面这样一个HTTP请求报文:
![a55bf4a553696025d5452310b3ac24a2.png](https://i-blog.csdnimg.cn/blog_migrate/1b7e7e990a5f669e7e8c74af70ca22da.jpeg)
HTTP请求POST方法
首先是字面意思的差别,GET方法表示的是获取页面,而POST方法表示的把数据交给服务器处理,当然在一定的时候POST方法要处理的数据也可以放在GET方法里面,但这不是安全的做法。
其次,在使用GET方法的时候,请求报文里面的请求实体是空的,因为GET方法把请求实体里面的数据显式的展示在了,URI里面,在浏览器的地址栏也能看见这些数据,因此类似于用户名和密码这些私密的内容就会暴露在大家面前;但POST方法不一样,POST方法是把请求处理的数据放在请求实体里面的,而在真实的HTTP通信中请求报文是加密的,所以相比于GET方法,如果要处理隐私数据那么POST方法是最佳的选择。
3、OPTIONS方法
OPTIONS方法可是大有作用,它主要用来查询针对某一个请求URI指定的资源支持那些HTTP请求方法的,相当于一个查询操作,查询的是Web资源支持使用哪些请求方法,服务器在收到HTTP请求的OPTIONS方法的时候,会返回这一个Web资源支持那些HTTP请求方法。
五、什么是协议版本?
协议版本相比于请求方法来说就更容易理解了,它其实就是指的HTTP协议的版本号,到目前为止HTTP协议一共有三个版本,分别是HTTP 0.9,HTTP/1.0和HTTP/1.1的版本,而现在我们常用的是HTTP/1.1版本。
接下来我们再来说一说请求首部字段的那些事。
请求首部字段
请求首部字段简单的讲就是从客户端向服务器端发送请求报文时使用的首部。补充了请求的附加内容、客户端信息、响应内容相关优先级等信息。通常情况下,我们能在请求报文中经常看见的请求首部字段有这些,小唐简单在这里给大家简单的描述下:
- Accept:用户代理可处理的媒体类型
- Accept-Charset:优先的字符集
- Accept-Encoding:优先的内容编码
- Accept-Language:优先的语言(自然语言)
- Host:请求资源所在的服务器
- Referer:对请求中URI的原始获取方
- User-Agent:HTTP客户端程序的信息
接下来,我们依次的看一下这些请求首部字段都是做什么用的,可以告诉服务器的那些附加请求信息。
1、Accept:用户代理可处理的媒体类型
Accept首部字段可通知服务器,用户代理能够处理的媒体类型以及媒体类型的优先级,可以使用type/subtype这种形式来表示。这里有几种常见的媒体类型表现形式可以参考一下:
(1)文本文件
text/html,text/json,application/xml等
(2)图片文件:
image/jpeg,image/png等
(3)视频文件:
video/mpeg等
(4)应用程序的二进制文件:
application/octest-stream等。
如果想要给显示的媒体类型增加优先级,则使用q=来额外表示权重值,用分号进行分隔。权重值q的范围是0-1,q为1的时候表示最大,不指定权重值q的时候默认q=1.0,当服务器提供多种内容的时候,将会首先返回权重值最高的媒体类型。
2、Accept-Charset:优先的字符集
Accept-Charset首部字段可以用来通知服务器用户代理支持的字符集及字符集相对优先顺序。另外,可一次性指定多种字符集。与首部字段Accept相同的是可以使用权重q来表示相对优先级。
3、Accept-Encoding:优先的内容编码
Accept-Encoding首部字段用来告知服务器用户代理支持的内容编码及内容编码的优先级顺序。可一次性指定多种内容编码。下面是常见的几种内容编码类型:gzip、deflate等,采用权重q值来表示相对优先级,也可以使用*号作为通配符,指定任意的编码格式。
4、Accept-Language:优先的语言(自然语言)
首部字段Accept-Language用来告知服务器用户代理能够处理的自然语言集(指中文或英文等),以及自然语言集的相对优先级。可一次指定多种自然语言集,同样的可以使用q来表示优先级。
5、Host:请求资源所在的服务器
首部字段Host会告知服务器,请求的资源所处互联网的主机名和端口号。Host首部字段是HTTP/1.1规范内是唯一一个必须被包含在请求内的首部字段。
6、Referer:对请求中URI的原始获取方
首部字段Referer会告知服务器请求的原始资源的URI,这个时候,服务器看见这个字段就会知道请求是从哪一个页面发起的。
7、User-Agent:HTTP客户端程序的信息
首部字段User-Agent会将创建请求的浏览器和用户代理名称等信息传达给服务器。
通过本篇文章,你将会学习到请求报文中常用的请求方法、常用的请求首部字段的意义,在接下来的文章中,小唐将会带你进入响应报文的学习,我们不见不散。
欢迎关注【小唐IT实用技术讲解】头条号,一起加速成长,成为一名优秀的互联网技术精英~如果你喜欢小唐的文章,不妨点赞、转发、收藏一下哦。