有两种 HTTP 报文的类型,请求(request)与响应(response),每种都有其特定的格式,下面将分别介绍这两种类型的报文。

一、HTTP 请求

HTTP 请求报文由**请求行(Request Line)、请求头(Request Header)、请求体(Request Body)**这三部分组成,下图是HTTP请求报文的格式:

HTTP请求报文

备注

  • 请求行和请求头都是以回车符<CR> + 换行符<LF>作为结束标志,同时在请求头的后面紧跟的是请求空行,这一行仅发送回车符<CR> + 换行符<LF>,用来表示请求头已发送完成,这样做是因为请求头的个数是不确定的,如果没有加入请求空行,WEB服务器就无法知道请求头到底什么时候结束。
  • 并不是所有的请求都有请求体,如GETDELETE请求是没有请求体的,而POSTPUT请求是有请求体的。

1、请求方法

下面将列出所有请求方法的名称及描述:

序号 方法名称 描述
1 GET GET方法请求一个指定资源的表示形式,使用GET的请求应该只被用于获取数据
2 HEAD HEAD方法请求一个与GET请求的响应相同的响应,但没有响应体
3 POST POST方法用于将实体提交到指定的资源,通常导致在服务器上的状态变化或副作用
4 PUT PUT方法用请求有效载荷替换目标资源的所有当前表示
5 DELETE DELETE方法删除指定的资源
6 CONNECT CONNECT方法建立一个到由目标资源标识的服务器的隧道
7 OPTIONS OPTIONS方法用于描述目标资源的通信选项
8 TRACE TRACE方法沿着到目标资源的路径执行一个消息环回测试
9 PATCH PATCH方法用于对资源应用部分修改

若需获知更多关于请求方法的信息,请参阅RFC 7231

2、URL

URL,即统一资源定位器(Uniform Resource Locator),是因特网的万维网服务程序上用于指定信息位置的表示方法。

注意

  1. URL 只能使用 ASCII 字符集来通过因特网进行发送。由于 URL 常常会包含 ASCII 集合之外的字符,URL 必须转换为有效的 ASCII 格式。
  2. URL 编码使用 “%” 其后跟随两位的十六进制数来替换非 ASCII 字符。
  3. URL 不能包含空格。URL 编码通常使用 + 来替换空格。

更多关于 URL 的知识,可以查看菜鸟教程 - HTML URL 编码

3、请求头

客户端发送请求头字段以提供更多信息。关于请求上下文、根据目标资源状态建议响应的首选格式、提供身份验证凭据或修改预期请求处理。这些字段充当请求修饰符,类似于编程语言方法调用的参数。

下面将列出一些常用的请求头:

请求头 说明
Accept 指定客户端能够接收的内容类型
Authorization HTTP授权的授权证书
Cache-Control 指定请求和响应遵循的缓存机制
Connection 表示是否需要持久连接(HTTP 1.1默认进行持久连接)
Cookie HTTP请求发送时,会把保存在该请求域名下的所有cookie值一起发送给web服务器
Content-Length 请求的内容长度
Content-Type 请求的与实体对应的MIME信息
Date 请求发送的日期和时间
Host 指定请求的服务器的域名和端口号
If-Range 如果实体未改变,服务器发送客户端丢失的部分,否则发送整个实体。参数也为Etag
Range 只请求实体的一部分,指定范围
Referer 先前网页的地址,当前请求网页紧随其后,即来路
User-Agent User-Agent的内容包含发出请求的用户信息
Via 通知中间网关或代理服务器地址,通信协议
Warning 关于消息实体的警告信息

若需获知更多关于响应头的信息,请参阅RFC 7231

4、请求体

请求体是浏览器向服务器发送的请求数据,格式由Content-Type请求头指定,常见的有x-www-form-urlencodedform-data等。

二、HTTP响应

HTTP 响应报文由**状态行(status-line)响应头(response header)响应体(response body)**这几部分组成,下图为 HTTP 响应报文的格式:

HTTP响应报文

1、状态码

状态代码元素是一个三位整数代码,它将试图理解和满足请求的结果。状态码由三位数字组成,第一位数字表示响应的类型,常用的状态码有五大类如下表所示:

状态码 描述
1XX 信息,服务器收到请求,需要请求者继续执行操作
2XX 成功,操作被成功接收并处理
3XX 重定向,需要进一步的操作以完成请求
4XX 客户端错误,请求包含语法错误或无法完成请求
5XX 服务器错误,服务器在处理请求的过程中发生了错误

下面将列出一些常用的 HTTP 响应状态码:

状态码 状态码描述 解释
200 OK 请求成功
201 Created 成功请求并创建了新的资源
202 Accepted 已经接受请求,但未处理完成
302 Found 临时移动,但资源只是临时被移动,客户端应继续使用原有URI
304 Not Modified 未修改。所请求的资源未修改,服务器返回此状态码时,不会返回任何资源
400 Bad Request 客户端请求的语法错误,服务器无法理解
401 Unauthorized 请求要求用户的身份认证
403 Forbidden 服务器理解请求客户端的请求,但是拒绝执行此请求
404 Not Found 服务器无法根据客户端的请求找到资源(网页)
405 Method Not Allowed 客户端请求中的方法被禁止
500 Internal Server Error 服务器内部错误,无法完成请求
502 Bad Gateway 作为网关或者代理工作的服务器尝试执行请求时,从远程服务器接收到了一个无效的响应

若需获知更多关于响应状态码的信息,请参阅RFC 7231

2、响应头

响应头字段允许服务器传递有关响应的附加信息,而不是状态行中的信息。这些头字段提供有关服务器、进一步访问目标资源或相关资源的信息。

下面将列出一些常见的响应头:

响应头 说明
Access-Control-Allow-Origin 指定哪些网站可以跨域源资源共享
Age 响应对象在代理缓存中存在的时间,以秒为单位
Allow 对于特定资源的有效动作
Cache-Control 通知从服务器到客户端内的所有缓存机制,表示它们是否可以缓存这个对象及缓存有效时间,其单位为秒
Connection 针对该连接所预期的选项
Content-Disposition 对已知MIME类型资源的描述,浏览器可以根据这个响应头决定是对返回资源的动作,如:将其下载或是打开
Content-Encoding 响应资源所使用的编码类型
Content-Length 响应消息体的长度,用8进制字节表示
Content-Type 当前内容的MIME类型
Date 此条消息被发送时的日期和时间(以RFC 7231中定义的”HTTP日期”格式来表示)
ETag 对于某个资源的某个特定版本的一个标识符,通常是一个 消息散列
Expires 指定一个日期/时间,超过该时间则认为此回应已经过期
Last-Modified 所请求的对象的最后修改日期
Location 用于在进行重定向,或在创建了某个新资源时使用
Refresh 用于重定向,或者当一个新的资源被创建时,默认会在5秒后刷新重定向
Server 服务器的名称
Set-Cookie 设置HTTP cookie
Vary 告知下游的代理服务器,应当如何对以后的请求协议头进行匹配,以决定是否可使用已缓存的响应内容而不是重新从原服务器请求新的内容
WWW-Authenticate 表示在请求获取这个实体时应当使用的认证模式

若需获知更多关于响应头的信息,请参阅RFC 7231

3、响应体

响应体是服务器返回给客户端的文本信息,信息的格式可通过Content-Type响应头来指定,如常见的text/html以及前后端使用JSON交换数据时使用的application/json

三、举例

下面我们以一个简单的用户注册为例,分析一次 HTTP 请求和响应的完整过程。

1、发送请求

  • 采用GET请求方式向服务器发送表单信息

    GET请求报文

    通过观察可以发现GET请求方法是直接将表单信息写入到URL当中,要注意URL的长度是有限制的,不同的浏览器和不同的服务器所能接受的最大长度是不一致的,因此要控制请求参数的长度。

  • 采用POST请求方式向服务器发送表单信息

    POST请求报文

    可以看到POST请求方式是将表单信息写在请求体中,请求体中的数据格式并不是固定的,只要双方约定好写入数据的格式,服务器就能根据约定解析数据,此外请求体的长度是没有限制的,理论上可以写入任意长度的数据。

2、响应结果

接着上面的登录案例,当点击注册按钮之后浏览器向服务器发送请求,服务器处理请求并返回结果,浏览器收到的响应报文如下:

HTTP响应报文

除了状态行和响应头之外,浏览器还收到了响应体,MIME类型为text/html,使用的字符集为utf-8,响应体内容如下:

1
<h1>注册成功!</h1>

浏览器解析响应体内容并将其展示在页面上:

浏览器显示结果