有两种 HTTP 报文的类型,请求(request)与响应(response),每种都有其特定的格式,下面将分别介绍这两种类型的报文。
一、HTTP 请求
HTTP 请求报文由请求行(Request Line)、请求头(Request Header)、请求体(Request Body)这三部分组成,下图是HTTP请求报文的格式:
备注
- 请求行和请求头都是以
回车符<CR>
+换行符<LF>
作为结束标志,同时在请求头的后面紧跟的是请求空行,这一行仅发送回车符<CR>
+换行符<LF>
,用来表示请求头已发送完成,这样做是因为请求头的个数是不确定的,如果没有加入请求空行,WEB服务器就无法知道请求头到底什么时候结束。 - 并不是所有的请求都有请求体,如
GET
、DELETE
请求是没有请求体的,而POST
、PUT
请求是有请求体的。
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),是因特网的万维网服务程序上用于指定信息位置的表示方法。
注意
- URL 只能使用 ASCII 字符集来通过因特网进行发送。由于 URL 常常会包含 ASCII 集合之外的字符,URL 必须转换为有效的 ASCII 格式。
- URL 编码使用 "%" 其后跟随两位的十六进制数来替换非 ASCII 字符。
- 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-urlencoded
、form-data
等。
二、HTTP响应
HTTP 响应报文由状态行(status-line)、响应头(response header)、响应体(response body)这几部分组成,下图为 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
请求方法是直接将表单信息写入到URL当中,要注意URL的长度是有限制的,不同的浏览器和不同的服务器所能接受的最大长度是不一致的,因此要控制请求参数的长度。 -
采用
POST
请求方式向服务器发送表单信息可以看到
POST
请求方式是将表单信息写在请求体中,请求体中的数据格式并不是固定的,只要双方约定好写入数据的格式,服务器就能根据约定解析数据,此外请求体的长度是没有限制的,理论上可以写入任意长度的数据。
2、响应结果
接着上面的登录案例,当点击注册按钮之后浏览器向服务器发送请求,服务器处理请求并返回结果,浏览器收到的响应报文如下:
除了状态行和响应头之外,浏览器还收到了响应体,MIME
类型为text/html
,使用的字符集为utf-8
,响应体内容如下:
<h1>注册成功!</h1>
浏览器解析响应体内容并将其展示在页面上: