当前位置:   article > 正文

HTTP协议-请求报文详解(Request)

请求报文

目录

前言:

1.Request报文

1.1报文格式

1.2格式图解

2.请求行(首行)

2.1URL

(1)概念

(2)基本格式

(3)补充部分

2.2Method(方法)

(1)方法类型

(2)GET方法

(3)POST方法

(4)GET与POST

(5)其他方法

2.3版本号

3.请求报头(Header)

3.1报头格式

3.2常见属性

(1)Host

(2)Content-Length

(3)Content-Type

(4)User-Agent

(5)Referer

(6)Cookie

4.空行

4.1空行标识

4.2空行作用

5.请求正文(Body)

5.1标识

5.2内容


前言:

  在了解完HTTP协议的基础知识之后,可以知道该协议有两种形式的报文,上一节主要了解了HTTP协议两种报文的基本格式。

  本节主要针对HTTP协议的请求报文(Request)进行详解,对请求报文的具体格式规范以及每个关键字的含义进行详细介绍。

序列:HTTP/HTTPS - 002


1.Request报文

1.1报文格式

 HTTP协议请求报文是以字符文本的格式传输,具体包含以下四大部分:

  1. 请求行(首行):[方法]+[url]+[版本号],分别使用空格分隔;
  2. 请求头(Header):请求的属性,每个键值对独占一行,冒号+空格来分割键和值;
  3. 空行:遇到空行表示Header部分结束;
  4. 正文(Body):空行后面的内容都是Body,Body允许为空字符串。

如果Body存在,则在Header中会有一个Content-Length属性来标识Body的长度。

1.2格式图解

 具体的请求Request报文格式分布如图:

 实际开发中的请求报文:

下文将针对请求报文这四大部分内容进行具体详解。

2.请求行(首行)

 [方法]+[url]+[版本号];

2.1URL

(1)概念

 我们平时俗称的“网址”其实就是说的URL(Uniform Resource Locator统一资源定位符)。

在互联网上的每个文件都有一个唯一的URL,它包含的信息指出文件的位置以及浏览器应该怎么处理它。

例如这是一个百度的网址,其实也就是百度的URL。

(2)基本格式

 一个URL的标椎基本格式如下:

拆解上述图中的URL,格式分段详解:

  1. 协议方案名:表示使用的协议类型,常见的有http和https,也有其他的类型。(例如访问 mysql时用的jdbc:mysql)
  2. 登陆信息:现在的网站进行身份认证一般不再通过URL进行了,一般都会省略
  3. 服务器地址:此处是一个“域名”,域名会通过DNS系统解析成一个具体的IP地址。
  4. 端口号:当端口号省略的时候,浏览器会根据协议类型自动决定使用哪个端口。例如http协议默认使用80端口,https协议默认使用443端口。
  5. 带层次的文件路径:表示需要访问的资源在服务器中的层次
  6. 查询字符串(query string):本质是一个键值对结构,键值对之间使用&分隔,键和值之间使用=分隔。
  7. 片段标识:片段标识主要用于页面内跳转。
(3)补充部分

 关于query string:query string中的内容是键值对结构,其中的key和value的取值和个数,完全都是程序员自己约定的。我们可以通过这样的方式来自定制传输我们需要的信息给服务器。

在日常开发中很多时候URL可以省略部分内容。

  • 协议名:可以省略,省略后默认为http://;
  • ip地址/域名:在HTML中可以省略(比如img,link,script,a标签的src或者href属性),省略后表示服务器的ip/域名与当前HTML所属的ip/域名一致;
  • 端口号:可以省略,省略后如果是http协议,端口号自动设为80,如果是https协议,端口号自动设为443;
  • 带层次的文件路径:可以省略,省略后相当于/.有些服务器会在发现/路径的时候自动访问/index.html;
  • 查询字符串:可以省略;
  • 片段标识:可以省略;

2.2Method(方法)

(1)方法类型

 在HTTP协议的请求报文中,有很多方法可以使用,不同的方法代表着不同的报文功能。

HTTP协议请求报文的所有方法如下(很多不常使用):

下边对HTTP请求报文中的常用方法进行详解。

(2)GET方法

 GET是最常用的HTTP方法,没有之一,其常用于获取服务器上的某个资源。

在浏览器中直接输入一个网址(URL),此时浏览器就会发送出一个GET请求,另外HTML中的link,img,script等标签,也会触发GET请求。

GET请求特点:

  1. 首行的第一部分为GET;
  2. URL的query string可以为空,也可以不为空;
  3. Header部分有若干个键值对结构;
  4. Body部分为空。

GET请求通常会把要传给服务器的数据,加到url的query string中(不是硬性规定,也可以不遵守),印证GET特点的第二条。

(3)POST方法

 POST方法也是一种常见的方法(仅次于GET方法),多用于提交用户输入的数据给服务器。

在登陆页面通过HTML中的form标签可以构造POST请求,或者使用JavaScript的ajax也可以构造POST请求。

POST请求特点:

  1. 首行的第一部分为POST;
  2. URL的query string一般为空 (也可以不为空);
  3. Header部分有若干个键值对结构;
  4. Body部分一般不为空;
  5. 若Body部分不为空,则Body内的数据格式通过Header中的content-Type指定,Body的长度由Header中的Content-Length指定。

POST请求通常把要传给服务器的数据,加到Body中(不是硬性规定,也可以不遵守)。 

(4)GET与POST

GET和POST的区别:

  1. 语义不同:GET一般用于获取数据,POST 一般用于提交数据;
  2. GET的Body一般为空,需要传递的数据通过query string传递;POST的query string一般为空,需要传递的数据通过Body传递;
  3. GET请求一般是幂等的,POST请求一般是不幂等的(如果多次请求得到的结果一样,就视为请求是幂等的);
  4. GET可以被缓存,POST不能被缓存(这一点也是承接幂等性)。

补充说明:

  1. 关于语义:GET完全可以用于提交数据,POST也完全可以用于获取数据。
  2. 关于幂等性:标准建议GET实现为幂等的,实际开发中GET也不必完全遵守这个规则(主流网站都有"猜你喜欢"功能,会根据用户的历史行为实时更新现有的结果)。
  3. 关于安全性:有些资料上说"POST比GET安全"这样的说法是不科学的,是否安全取决于前端在传输密码等敏感信息时是否进行加密,和GET,POST无关。
  4. 关于传输数据量:有的资料上说"GET传输的数据量小,POST传输数据量大",这个也是不科学的,标准没有规定GET的URL的长度,也没有规定POST的body的长度,传输数据量多少,完全取决于不同浏览器和不同服务器之间的实现区别。
  5. 关于传输数据类型:有的资料上说"GET只能传输文本数据,POST可以传输二进制数据"这个也是不科学的,GET的query string虽然无法直接传输二进制数据,但是可以针对二进制数据进行url encode。
(5)其他方法

 在HTTP协议的请求报文方法中,最常用的是GET和POST方法。除此之外的所有方法,在开发过程中都很少使用,所以对于其他的方法仅了解即可。

  • PUT与 POST相似,只是具有幂等特性,一般用于更新;
  • DELETE 删除服务器指定资源;
  • OPTIONS 返回服务器所支持的请求方法;
  • HEAD 类似于GET,只不过响应体不返回,只返回响应头;
  • TRACE 回显服务器端收到的请求,测试的时候会用到这个;
  • CONNECT 预留,暂无使用。

这些方法的HTTP请求可以使用ajax来构造,也可以使用一些第三方工具。

2.3版本号

 版本号表示本次HTTP协议的请求使用的是HTTP协议的具体哪个版本。

请求报文的版本号会与响应报文的版本号相对应,否则会出现通信错误。

版本号一般有三种,如:HTTP1.0、HTTP1.1和HTTP2.0。

3.请求报头(Header)

3.1报头格式

 请求的属性,Header的整体的格式也是“键值对”结构。每个键值对独占一行,键和值之间使用冒号+空格进行分割。

请求报头的属性有很多,此处仅介绍几个常见的。

3.2常见属性

 以下图的请求报文属性为例:

(1)Host

 表示服务器主机的地址和端口(这个信息在URL中也存在的)。

(2)Content-Length

 表示Body中的数据长度(请求报文里有Body,才有该属性存在)。

(3)Content-Type

 表示请求的Body中的数据格式(请求报文里有Body,才有该属性存在)。

HTTP协议的请求格式一般有:

  1. json格式;
  2. form表单的格式;
  3. form-data的格式。

后续给服务器提交给请求,不同的Content-Type,服务器处理数据的逻辑是不同的。

服务器返回数据给浏览器,也需要设置合适的Content-Type,浏览器也会根据不同的Content-Type 做出不同的处理。

(4)User-Agent

 User-Agent简称UA,表示浏览器/操作系统的属性,现在主要用来区分PC端还是移动端设备。

UA表述了主机操作系统版本和浏览器的版本,通俗点说,UA表示你用什么设备上网。

(5)Referer

 表示这个页面是从哪个页面跳转过来的。

如果直接在浏览器中输入URL,或者直接通过收藏夹访问页面时是没有Referer属性的。

(6)Cookie

 Cookie中存储了一个字符串,往往是从服务器返回的数据(也可以是页面自己生成的)。Cookie是按照键值对的形式来组织的,这里的键值对也都是程序猿自定义的(和query string差不多)。

Cookie存储到浏览器所在主机的硬盘上,并且是按照域名为维度来存储的(每个域名下可以存自己的Cookie,彼此之间不影响)。

Cookie中存储一些浏览器发给服务器的临时数据,浏览器就把这些临时数据存在了本地,后续再请求这个服务器的时候,就会把Cookie中的内容自动代入到请求中,发给服务器,服务器通过Cookie的内容做一些逻辑上的处理。

往往可以通过Cookie这个字段实现"身份标识"的功能。每个不同的域名下都可以有不同的Cookie,不同网站之间的Cookie并不冲突。

4.空行

4.1空行标识

 遇到空行表示Header(报头)部分结束,同时也是Body(正文)部分开始。

4.2空行作用

 HTTP在传输层依赖TCP协议,TCP是面向字节流的,如果没有这个空行,就会出现“粘包问题”,空行就可以解决上述问题。

5.请求正文(Body)

5.1标识

 空行后面的内容都是Body,Body允许为空字符串。

如果Body存在,则在Header中会有一个Content-Length属性来标识Body的长度;Content-Type表示请求的Body中的数据格式。

  • GET的Body一般为空,需要传递的数据通过query string传递;
  • POST的Body一般不为空,需要传递的数据通过Body传递;

5.2内容

 Body的内容为字符串文本格式,具体传输主机中与服务器的交互数据,可以传输字符串数据、二进制图片、视频等,但是二进制数据需要进行转码表示。

Body的格式一般有:

  1. json格式;
  2. form表单的格式;
  3. form-data的格式。

后续给服务器提交给请求,不同的Content-Type,服务器处理数据的逻辑是不同的。


以上便是HTTP协议中的请求报文详解Request,感谢阅读。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/681266
推荐阅读
相关标签
  

闽ICP备14008679号