整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

HTTP 报文详解

HTTP 报文详解

T+技术学习视频资源,500+技术电子书,大量高效工具及网站,私信回复【资源】即可免费获取


HTTP 报文是在应用程序之间发送的数据块,这些数据块将通过以文本形式的元信息开头,用于 HTTP 协议交互。请求端(客户端)的 HTTP 报文叫做请求报文,响应端(服务器端)的叫做响应报文。 HTTP 报文本身是由多行(用 CR+LF 作换行符)数据构成的字符串文本。

请求报文

HTTP 请求报文由请求行请求头空行请求包体(body)组成。如下图所示:

真实示例:

GET / HTTP/1.1     
Host: www.baidu.com
Connection: keep-alive
Cache-Control: max-age=0
sec-ch-ua: " Not A;Brand";v="99", "Chromium";v="96", "Google Chrome";v="96"
sec-ch-ua-mobile: ?0
sec-ch-ua-platform: "macOS"
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Sec-Fetch-Site: none
Sec-Fetch-Mode: navigate
Sec-Fetch-User: ?1
Sec-Fetch-Dest: document
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
Cookie: BIDUPSID=8B0207CE0B6364E5934651E84F17999B; PSTM=1619707475; 

1.请求行

主要描述了客户端想要如何操作服务端的资源;请求行由三部分构成:

  • 请求方法:表示对资源期望进行何种操作,常用的如 GET、POST
  • 请求目标:通常是一个 URL ,表明了要操作的资源。
  • 版本号:表示报文使用的 HTTP 协议版本。

这三个部分通常使用空格(space)来分隔,最后要用 CRLF 换行表示结束。

GET / HTTP/1.1  

这个请求行,结合之前的描述,意思就是“服务端妹子你好,我是客户端蛋蛋,现在我想获取网站根目录的默认信息,我这边用的协议版本是 1.1,麻烦你也要用这个版本回复我哦”

2.请求头

HTTP的报文头,报文头包含若干个属性,格式为“属性名:属性值”,服务端据此获取客户端的信息。与缓存相关的规则信息,均包含在header中,请求头可大致分为四种类型:通用首部字段、请求首部字段、响应首部字段、实体首部字段。这里先简单罗列,稍后做具体解释。

3.请求体

请求体就是 HTTP 要传输的内容,HTTP 可以承载很多类型的数字数据:图片、音频、视频、HTML 文档等。

  • 介绍响应报文
  • 首部字段
  • 介绍功能

响应报文

HTTP 响应报文由状态行响应头部空行响应包体(body)组成。如下图所示:

以请求 www.baidu.com为例:

HTTP/1.1 200 OK
Bdpagetype: 1
Bdqid: 0xfb0d743100040ad2
Cache-Control: private
Connection: keep-alive
Content-Encoding: gzip
Content-Type: text/html;charset=utf-8
Date: Fri, 24 Dec 2021 08:20:44 GMT
Expires: Fri, 24 Dec 2021 08:20:44 GMT
Server: BWS/1.1
Set-Cookie: BDSVRTM=17; path=/
Set-Cookie: BD_HOME=1; path=/
Set-Cookie: H_PS_PSSID=35635_34439_35104_35628_35488_35436_35456_34584_35491_35584_35586_34873_35317_26350_35610_35562; path=/; domain=.baidu.com
Strict-Transport-Security: max-age=172800
Traceid: 1640334044050133761018090243032019634898
X-Frame-Options: sameorigin
X-Ua-Compatible: IE=Edge,chrome=1
Transfer-Encoding: chunked

1.状态行

状态行包含了 协议版本状态码以及状态描述

  • 协议版本:指明了报文使用的 HTTP 协议版本
  • 状态码:状态码是一个三位数字,用来表示处理的结果,下面列出了状态码的类别:
  • 状态描述:这个是作为状态码的补充,是一段更详细的文字,帮助人们理解原因。

2.响应头部

和请求报文的请求头类似,响应头也由键值对组成,每行一对,键和值用英文冒号 : 分隔。响应头域允许服务器传递不能放在状态行的附加信息,这些域主要描述服务器的信息和Request-URI进一步的信息

3.响应包体

服务器返回给浏览器的响应信息,响应数据的格式是根据服务器来的,常见的响应数据格式有:text/html、application/json等。

常见的响应格式:

HTTP 首部字段

在 HTTP 的请求头和响应头中都是由首部字段来表示的,首部内容可以为客户端和服务器分别处理请求和响应提供所需要的信息。

首部字段可以分为通用首部字段请求首部字段响应首部字段实体首部字段

通用首部字段

通用首部字段是指请求报文和响应报文都会使用到的首部字段。

先来看下都有哪些字段:

Cache-Control

通过指定 Cache-Control 的指令,就能操作缓存的工作机制。

一般在客户端和服务端之间还存在一个缓存服务器,如果请求的资源在缓存服务器中有,就不会再请求源服务器,提高了请求响应的效率。

指令的参数可以多选,通过“,”分隔。

Cache-Control: private, max-age=0, no-cache

public 指令

Cache-Control: public

当使用 public 指令时,明确表明其他用户也可以利用缓存。

private 指令

Cache-Control: private

当指定 private 指令后,响应只以特定的用户作为对象,这与 public 指令的行为相反。

缓存服务器会对该特定用户提供资源缓存的服务,对于其他用户发送过来的请求,代理服务器则不会返回缓存。

no-cache 指令

Cache-Control: no-cache

使用 no-cache 指令可以防止从缓存中拿过期的数据。

在请求中如果包含该指令,则客户端将不会接收缓存过的响应,中间的缓存服务器会把请求转发给源服务器。

如果响应中包含该指令,缓存服务器会向源服务器进行资源有效期的确认,如果是过期的资源则不缓存。

no-store 指令

Cache-Control: no-store

该指令规定缓存不能在本地存储请求或响应的任一部分。这里我们要和上面那个 no-cache 指令要区分开,no-store才是真正不进行缓存,no-cache 只是不对过期的资源进行缓存。

Connection

Connection 有两个作用:控制不再转发给代理的首部字段、管理持久连接。

  • 控制不再转发给代理的首部字段Connection: 不再转发的首部字段名
  • 管理持久连接
Connection: close

当服务器端想明确断开连接时,则指定 Connection 首部字段的值为 Close。

Date

首部字段 Date 表明创建 HTTP 报文的日期和时间。

Trailer

首部字段 Trailer 会事先说明在报文主体后记录了哪些首部字段。该首部字段可应用在 HTTP/1.1 版本分块传输编码时。

Transfer-Encoding

该字段规定了传输报文主体时采用的编码方式。 HTTP/1.1 的传输编码方式仅对分块传输编码有效。

请求首部字段

请求首部字段是从客户端往服务器端发送请求报文中所使用的字段,用于补充请求的附加信息、客户端信息、对响应内容相关的优先级等内容。

常用字段具体说明

Accept

Accept: text/html,application/xhtml+xml,application/xml;q=0.3

该字段可以通知服务器 客户端能够接收处理的媒体类型及优先级。

比如,如果浏览器不支持 PNG 图片的显示,那 Accept 就不指定 image/png ,而指定可处理的 image/gif 和 image/jpeg 等图片类型。 若想要给显示的媒体类型增加优先级,则使用 q=来额外表示权重值。用分号(;)进行分隔。权重值 q 的范围是 0~1(可精确到小数点 后 3 位),且 1 为最大值。不指定权重 q 值时,默认权重为 q=1.0。

Accept-Charset

Accept-Charset: iso-8859-5, unicode-1-1;q=0.8

通知服务器 客户端支持的字符集及字符集的相对优先顺序。

Accept-Encoding

Accept-Encoding: gzip, deflate

首部字段用来告知服务器 客户端支持的内容编码及内容编码的优先级顺序。可一次性指定多种内容编码。

Accept-Language

Accept-Language: zh-cn,zh;q=0.7,en-us,en;q=0.3

用来告知服务器 客户端能够处理的自然 语言集(指中文或英文等),以及自然语言集的相对优先级。可一次 指定多种自然语言集。

Authorization

Authorization: Basic dWVub3NlbjpwYXNzd29yZA==

首部字段 Authorization 是用来告知服务器,客户端的认证信息(证书值)。

User-Agent

User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:13.0)

首部字段 User-Agent 会将创建请求的浏览器和用户代理名称等信息传 达给服务器。

由网络爬虫发起请求时,有可能会在字段内添加爬虫作者的电子邮件地址。此外,如果请求经过代理,那么中间也很可能被添加上代理服务器的名称。

响应首部字段

响应首部字段是由服务器端向客户端返回响应报文中所使用的字段,用于补充响应的附加信息、服务器信息,以及对客户端的附加要求等信息。

Accept-Ranges

Accept-Ranges: bytes    当不能处理范围请求时,Accept-Ranges: none

用来告知客户端服务器是否能处理范围请 求,以指定获取服务器端某个部分的资源。

Age

Age: 600

Age 能告知客户端,源服务器在多久前创建了响应。字段值的单位为秒。

Location

Location: http://www.usagidesign.jp/sample.html

该字段可以将响应接收方引导至某个与请求 URI 位置 不同的资源。

基本上,该字段会配合 3xx :Redirection 的响应,提供重定向的 URI。

Retry-After

Retry-After: 120

告知客户端应该在多久之后再次发送请求。主要 配合状态码 503 Service Unavailable 响应,或 3xx Redirect 响应一起使 用。

Server

Server: Apache/2.2.17 (Unix)

告知客户端当前服务器上安装的 HTTP 服务器应用程序的信息。

实体首部字段

实体首部字段是包含在请求报文和响应报文中的实体部分所使用的首部,用于补充内容的更新时间等与实体相关的信息。

Allow

Allow: GET, HEAD

用于通知客户端能够支持 Request-URI 指定资源的所有 HTTP 方法。

Content-Encoding

Content-Encoding: gzip

会告知客户端服务器对实体的主体部分选用的内容编码方式。

Content-Language

Content-Language: zh-CN

首部字段 Content-Language 会告知客户端,实体主体使用的自然语言。

Content-Length

Content-Length: 15000

表明了实体主体部分的大小(单位是字 节)。

Content-Type

Content-Type: text/html; charset=UTF-8

说明了实体主体内对象的媒体类型。

网络安全在我身边##职场面试#

经过这一段时间的学习,我们已经学习了HTTP的基础知识。今天,小唐将会带领大家正式的开始学习有关HTTP的知识。

在之前的文章,小唐告诉了大家HTTP通信包括HTTP请求和HTTP响应,并且也告诉了大家两台主机在进行HTTP通信的时候,通信的内容可以通过HTTP请求报文和HTTP响应报文来分析。

在接下来的一段时间,我们来聊聊HTTP请求。


在HTTP请求中,包含了客户端要对服务器所请求的内容和请求的信息,不管是内容还是信息,都是我们HTTP请求的基础。严格意义上来讲HTTP请求报文的每一个部分都有着其特定的含义。

HTTP请求报文由请求头、请求首部和请求实体三个主要部分组成,如下图:

HTTP请求报文组成

什么是请求头?

请求头是HTTP头的一种,可以在HTTP请求中使用。用来对HTTP的请求做一个详细的描述,并且要确保这样的HTTP请求能够让服务端返回正确的响应。简单的讲,请求头就像是某一篇议论文的第一段,起着概括性的描述的作用。

什么是请求首部?

请求首部是为了确保对HTTP请求有着更加详细的描述。用于告诉服务器是谁或什么在发送请求、请求的来源在哪里等信息。因此服务器可以根据请求首部给出的客户端信息来给客户端提供更好的响应。我们可以这样来理解,如果我们的HTTP请求头作为一个大纲性的指导,那么,HTTP请求首部就是对这个大纲更进一步的描述。当规定了指导性的大纲后,也作出了具体的规划。接下来我们就需要根据大纲和规范的指导,开始把请求数据正式的发送给服务器了,这就是请求实体的作用。

什么是请求实体?

简而言之,请求实体就是我们要传输的数据了。因为,请求头规定了大体的方向,请求首部告诉了我们客户端要把请求发出去具体要怎么做,还少了一部分请求需要把什么内容发出去,而这一个缺少的部分就是通过请求实体来实现的。

简单的一句话理解就是请求头规定了方向,请求首部落实了细节,请求实体负责具体的实施。这三者之间的关系十分密切也是缺一不可的。


随着互联网的发展,人们觉得对于HTTP报文的请求头、请求首部和请求实体的定义太过于抽象。因此,又把HTTP请求报文的这三部分内容做了一个更加详细的划分,充分利用了分层的“分而治之”的思想。

人们把HTTP报文的请求头划分为了请求方法、请求URI和协议版本三个部分;把请求首部又划分出了许多有意义的字段,而请求实体本来就是一起的,把抽象的HTTP请求具体化了,因此我们可以画出如下的更加具体的HTTP请求报文图了:

HTTP请求报文结构

在接下来关于HTTP请求报文的学习,就会围绕HTTP请求报文的结构来学习。

请求方法

一、什么是请求方法?

对于请求方法的最简单理解就是告知服务器的请求意图以及用什么方式去请求。在HTTP/1.1中规定了八大请求方法。

二、什么是请求URI?

要想理解请求URI是什么,首先我们得理解什么是URI,为了方便大家的理解,小唐给大家举一个简单的例子,在你的面前,有着许多的盒子,每一个盒子都有一个唯一表示盒子所在位置的符号用来告诉你需要去哪里找这些盒子,大概意思就是盒子的位置是唯一的,我们可以通过定位的方式查找盒子所在的位置。那么,在广阔的互联网中,有着很多的互联网资源,不同的资源在互联中的位置都是唯一的。如果人们想要在互联网中寻找某一个资源,那么,就一定会在互联网中找到一个唯一用来定位互联网资源的方法,这就是URI。URI在计算机领域叫做统一资源定位符,也就是小唐说的那一个唯一表示位置的的符号。

如果人们想要访问互联网的资源,他一定不是随便访问的,因为人们知道所要寻找什么样的互联网资源,因此人们也知道这些资源在互联网中的URI。所以如果想要访问指定的互联网资源,我们只需要找到这个资源的URI就行了,这样的过程就叫做请求URI。

那么,请求URI在什么位置可以找到呢,如果你是仔细的并且在访问网站的时候你也留意过网站的域名变化,你一定遇到过这样的格式:

找一找请求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请求报文:

HTTP请求报文1

如上图,客户端对服务器发起了一个请求,其中请求的方法是GET,请求的URI是/index.html,用的是HTTP协议1.1版本的规范,并且通过首部指明了请求的服务器主机为www.example.com,此时,如果服务器收到了这样的请求就会返回一个指定的资源。大白话理解就是,客户端想访问www.example.com的网站服务器的index.html资源,然后服务器把这个资源返回给客户端。

再举一个例子,假设网站服务器上有一个查询页面的Web资源,我们把它叫做search.php页面,这个页面的主要功能是可以根据姓名和年龄来查询信息,那么,客户端想要想要请求服务器的查询功能的时候就会产生这样一个请求报文:

HTTP请求报文2

这个时候服务器收到这样的请求就会把相应的结果返回给客户端了。

2、POST方法

主要是用来传输请求主体的内容的,有着和GET方法同样的作用,比如GET方法中的请求报文2这张图,POST方法主要经常用于在网页中有进行数据交互的表格。可以想象这样一个页面,在页面中有着两个输入框,一个是用来输入姓名的,一个是用来输入年龄的,还有一个查询按钮,点击查询按钮后,我们可以获取查询后的结果,如果客户端要获取这样一个查询页面的查询结果,就需要使用到POST方法了,因此POST方法就是一个把数据发送给服务器处理的过程。使用POST方法会产生类似于下面这样一个HTTP请求报文:

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实用技术讲解】头条号,一起加速成长,成为一名优秀的互联网技术精英~如果你喜欢小唐的文章,不妨点赞、转发、收藏一下哦。

TTP有两种报文格式:

请求报文:由客户端向服务器端发出的报文。

响应报文:从服务端到客户端的报文。

我们呢,一个一个来说一下,先说请求报文。先看一下大学期间比较熟悉的一张图

请求报文:

我们先从最右边开始看,可以看出来,HTTTP请求报文由三部分构成,分别是:请求行、请求头、请求实体。当然,严格意义上来说,应该还包括空行。


一.请求行:

首先,为什么要用请求行?

其实,请求航的存在其主要目的就是为了区分报文是请求报文还是响应报文,以及记录相应的URL以及协议版本。可以看出,请求行主要由三部分构成:方法、请求资源的URL、HTTP的版本。其中URL和版本无须多说,咱们主要说一下“方法”;

HTTP请求的方法主要有:GET、POST、PUT、DELETE、OPTIONS、HEAD、TRANCE、CONNECT

其中,最常用的是GET和POST请求,但是我们都来了解一下。

  1. GET:想特定的资源发出请求。
  2. POST:向指定的资源提交相应的数据金星焕处理请求,比如说提交表单、上传文件。数据被包含在请求实体中。
  3. PUT:从客户端向服务器传送的数据取代指定的文档的内容。
  4. DELETE:请求服务器删除指定的页面
  5. OPTIONS:允许客户端查看服务器的性能。
  6. HEAD:类似于get请求,只不过返回的响应中没有具体的内容,用于获取报头
  7. TRANS:回显服务器收到的请求,主要用于测试或诊断。
  8. CONNECT:HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。

我们重点来说一下GET和POST方法。

1、GET请求,请求的数据会附在URL后面,已key=value(参数名=参数值)的形式传递,具体例子:http://localhost:8888/abc/login.jsp?name=hyddd&password=idontknow&verify=%E4%BD%A0%E5%A5%BD,在这里有一点十分的重要:GET请求中的参数用“?”分割URL实体和传递参数,而参数之间用“&”进行分割。其中,如果传输的数据是英文字母或者数据,则原样发送;如果时空格,转换成“+”;如果是中文或者其他的字符,则直接把传输的数用BASE64加密,转换成十六进制输出,比如后面的%E4%BD%A0%E5%A5%BD就是16进制的输出。

POST请求,则是把提交的数据放在HTTP请求实体中。

2、GET请求最大长度是有限制的,可能有一种说法是GET请求传递参数的最大长度是1024KB,其实这种说法是不准确的。实际中,URL并不存在参数上限的限制,HTTP规范里面也并没有对URL的长度进行限制。而这个限制主要是来自浏览器和服务器。比如IE6.0浏览器所支持的最大长度的URL长度是2083KB,firefox 3.0.3浏览器所支持的最大长度是7764KB.

POST请求传递的数据是没有大小限制的,HTTP规范中也没有对其进行相应的限制。只不过是处理器的处理能力限制了它。

一般来说,GET请求传递的数据大小要小于POST传递数据的大小。

3、POST的安全性要比GET请求的安全性要高一些。因为GET请求传递的参数是后缀在URL后面的,可以直接看到,所以安全性较POST请求安全性会差一些!

我们来看一下具体请求报文示例:

其中第一行就是请求行,上图中“GET”代表着请求的方法为GET请求,HTTP/1.1 代表这使用的HTTP协议的版本,中间代表着URL。


二.请求头:

1、请求头的作用:请求头是用来通知服务器有关客户端请求的一些信息。

2:请求头的格式:请求头由关键字/值对构成,每行一对。关键字和值用英文冒号“:”隔开,值对之间用英文逗号","隔开。

比如上图中:Accept、Host、User-Agent等等都是请求头中关键字。

我们来了解几个比较重要的请求头中属性,后期我们会有专门的一篇文章去介绍HTTP 报文的头部。

Accept:指定客户端能够接收的内容类型 示例:Accept: text/plain, text/html

Cookie:HTTP请求发送时,会把保存在该请求域名下的所有cookie值一起发送给web服务器。 示例:Cookie: $Version=1; Skin=new;

Content-Type:显示HTTP提交的内容类型,一般来说POST请求会设置这个属性 示例:Content-Type: application/x-www-form-urlencoded

三.请求实体:

请求实体作用:用来传输具体数据报文

请求头和请求正文之间会有一个空行,这个空行非常的重要,主要是用来告诉服务器端请求头已经结束了,接下来的是请求正文啦!具体见下图。

上图中的“Pn=2&kw=nba”就是具体的请求报文。


响应报文:

严格意义上将,响应报文由四部分构成:状态行、响应头、空行、响应正文构成。

一.状态行

在响应中唯一真正的区别在于第一行中用状态信息代替了请求信息。状态行(status line)通过提供一个状态码来说明所请求的资源情况。

状态行格式如下:

HTTP-Version Status-Code Reason-Phrase CRLF

其中,HTTP-Version表示服务器HTTP协议的版本;Status-Code表示服务器发回的响应状态代码;Reason-Phrase表示状态代码的文本描述。状态代码由三位数字组成,第一个数字定义了响应的类别,且有五种可能取值。

其中状态行由3部分构成,分别是协议版本、状态码、状态描述,之间由空格构成。

对于,我们开发人员来说,状态行中可能最重要的就是状态码,不同状态码能表示出此次请求的状态。

状态码由三位数字组成,其中200~299代表着成功,300~399代表着资源重定向,400~499代表客户端请求错误,500~599表示服务器端出错。

其中呢,有几个状态码是比较常见,比较重要的,上图!

二.响应头部:

与请求头部是类似的,它是用来告诉客户端响应报文的一些相关信息的。前面我们已经大致的讲述了请求头,响应头部我们就直接上图吧。

响应头说明Server服务器应用程序软件的名称和版本Content-Type响应正文的类型(是图片还是二进制字符串)Content-Length响应正文长度Content-Charset响应正文使用的编码Content-Encoding响应正文使用的数据压缩格式Content-Language响应正文使用的语言

三.响应正文:

用来传输响应数据,跟请求实体是类似的,在这里就不赘述了。