HTTP 请求报文由客户端发出,在发送报文之前要先与服务器建立 TCP 连接,如果使用 HTTPS 协议还需要建立 TLS/SSL 加密隧道连接,HTTP 请求报文是由三部分组成: 请求行 , 请求报头 请求正文

实例

举个例子,下面是对 www.google.com 发出的请求报文。我们可以在 Google Dev Tools 中查看。

1
2
3
4
5
6
7
8
9
10
GET / HTTP/1.2
accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
accept-encoding: gzip, deflate, br
accept-language: zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7,zh-TW;q=0.6
cache-control: no-cache
cookie: OTZ=4569705_24_24__24_; _ga=GA1.1.1839148291.1537105919; HSID=AOuQZEx7qIgKNr4Gg; SSID=sdsdfgGFWWA...
dnt: 1
pragma: no-cache
upgrade-insecure-requests: 1
user-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.81 Safari/537.36

HTTP 请求行

请求行标示请求方法、请求资源相对地址和 HTTP 协议版本

常用的请求方法

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

HTTP 请求报头

包含请求的附加信息和客户端的标识信息。

常用标准请求头字段:

字段 含义 示例
Accept 设置接受的内容类型 Accept: text/plain
Accept-Charset 设置接受的字符编码 Accept-Charset: utf-8
Accept-Encoding 设置接受的编码格式 Accept-Encoding: gzip, deflate
Accept-Datetime 设置接受的版本时间 Accept-Datetime: Thu, 31 May 2007 20:35:00 GMT
Accept-Language 设置接受的语言 Accept-Language: en-US
Authorization 设置 HTTP 身份验证的凭证 Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==
Cache-Control 设置请求响应链上所有的缓存机制必须遵守的指令 Cache-Control: no-cache
Connection 设置当前连接和 hop-by-hop 协议请求字段列表的控制选项 Connection: keep-alive
Connection: Upgrade
Content-Length 设置请求体的字节长度 Content-Length: 348
Content-MD5 设置基于 MD5 算法对请求体内容进行 Base64 二进制编码 Content-MD5: Q2hlY2sgSW50ZWdyaXR5IQ==
Content-Type 设置请求体的 MIME 类型(适用 POST 和 PUT 请求) Content-Type: application/x-www-form-urlencoded
Cookie 设置服务器使用 Set-Cookie 发送的 http cookie Cookie: $Version=1; Skin=new;
Date 设置消息发送的日期和时间 Date: Tue, 15 Nov 1994 08:12:31 GMT
Expect 标识客户端需要的特殊浏览器行为 Expect: 100-continue
Forwarded 披露客户端通过 http 代理连接 web 服务的源信息 Forwarded: for=192.0.2.60;proto=http;by=203.0.113.43
Forwarded: for=192.0.2.43, for=198.51.100.17
From 设置发送请求的用户的 email 地址 From: user@example.com
Host 设置服务器域名和 TCP 端口号,如果使用的是服务请求标准端口号,端口号可以省略 Host: en.wikipedia.org:8080
Host: en.wikipedia.org
If-Match 设置客户端的 ETag, 当时客户端 ETag 和服务器生成的 ETag 一致才执行,适用于更新自从上次更新之后没有改变的资源 If-Match: “737060cd8c284d8af7ad3082f209582d
If-Modified-Since 设置更新时间,从更新时间到服务端接受请求这段时间内如果资源没有改变,允许服务端返回 304 Not Modified If-Modified-Since: Sat, 29 Oct 1994 19:43:31 GMT
If-None-Match 设置客户端 ETag,如果和服务端接受请求生成的 ETage 相同,允许服务端返回 304 Not Modified If-None-Match: “737060cd8c284d8af7ad3082f209582d”
If-Range 设置客户端 ETag,如果和服务端接受请求生成的 ETage 相同,返回缺失的实体部分;否则返回整个新的实体 If-Range: “737060cd8c284d8af7ad3082f209582d”
If-Unmodified-Since 设置更新时间,只有从更新时间到服务端接受请求这段时间内实体没有改变,服务端才会发送响应 If-Unmodified-Since: Sat, 29 Oct 1994 19:43:31 GMT
Max-Forwards 限制代理或网关转发消息的次数 Max-Forwards: 10
Origin 标识跨域资源请求(请求服务端设置 Access-Control-Allow-Origin 响应字段) Origin: http://www.example-social-network.com
Pragma 设置特殊实现字段,可能会对请求响应链有多种影响 Pragma: no-cache
Proxy-Authorization 为连接代理授权认证信息 Proxy-Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==
Range 请求部分实体,设置请求实体的字节数范围,具体可以参见 HTTP/1.1 中的 Byte serving Range: bytes=500-999
Referer 设置前一个页面的地址,并且前一个页面中的连接指向当前请求,意思就是如果当前请求是在 A 页面中发送的,那么 referer 就是 A 页面的 url 地址 Referer: http://en.wikipedia.org/wiki/Main_Page
TE 设置用户代理期望接受的传输编码格式,和响应头中的 Transfer-Encoding 字段一样 TE: trailers, deflate
Upgrade 请求服务端升级协议 Upgrade: HTTP/2.0, HTTPS/1.3, IRC/6.9, RTA/x11, websocket
User-Agent 用户代理的字符串值 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.81 Safari/537.36
Via 通知服务器代理请求 Via: 1.0 fred, 1.1 example.com (Apache/1.1)
Warning 实体可能会发生的问题的通用警告 Warning: 199 Miscellaneous warning

常用非标准请求头字段

字段 含义 示例
X-Requested-With 标识 Ajax 请求,大部分 js 框架发送请求时都会设置它为 XMLHttpRequest X-Requested-With: XMLHttpRequest
DNT 请求 web 应用禁用用户追踪 DNT: 1 (Do Not Track Enabled)
DNT: 0 (Do Not Track Disabled)
X-Forwarded-For 一个事实标准,用来标识客户端通过 HTTP 代理或者负载均衡器连接的 web 服务器的原始 IP 地址 X-Forwarded-For: client1, proxy1, proxy2
X-Forwarded-For: 129.78.138.66, 129.78.64.103
X-Forwarded-Host 一个事实标准,用来标识客户端在 HTTP 请求头中请求的原始 host, 因为主机名或者反向代理的端口可能与处理请求的原始服务器不同 X-Forwarded-Host: en.wikipedia.org:8080
X-Forwarded-Host: en.wikipedia.org
X-Forwarded-Proto 一个事实标准,用来标识 HTTP 原始协议,因为反向代理或者负载均衡器和 web 服务器可能使用 http, 但是请求到反向代理使用的是 https X-Forwarded-Proto: https
Front-End-Https 微软应用程序和负载均衡器使用的非标准 header 字段 Front-End-Https: on
X-Http-Method-Override 请求 web 应用时,使用 header 字段中给定的方法(通常是 put 或者 delete)覆盖请求中指定的方法(通常是 post),
如果用户代理或者防火墙不支持直接使用 put 或者 delete 方法发送请求时,可以使用这个字段
X-HTTP-Method-Override: DELETE
X-ATT-DeviceId 允许更简单的解析用户代理在 AT&T 设备上的 MakeModel/Firmware X-Att-Deviceid: GT-P7320/P7320XXLPG
X-Wap-Profile 设置描述当前连接设备的详细信息的 xml 文件在网络中的位置 x-wap-profile: http://wap.samsungmobile.com/uaprof/SGH-I777.xml
Proxy-Connection 早起 HTTP 版本中的一个误称,现在使用标准的 connection 字段 Proxy-Connection: keep-alive
X-UIDH 服务端深度包检测插入的一个唯一 ID 标识 Verizon Wireless 的客户 X-UIDH: …
X-Csrf-Token,X-CSRFToken,X-XSRF-TOKEN 防止跨站请求伪造 X-Csrf-Token: i8XNjC4b8KVok4uw5RftR38Wgp2BFwql
X-Request-ID,X-Correlation-ID 标识客户端和服务端的 HTTP 请求 X-Request-ID: f058ebd6-02f7-4d3f-942e-904344e8cde5

HTTP 请求正文

当使用 POST, PUT 等方法时,需要客户端向服务器传递参数。这些数据就储存在请求正文中。在请求报头中有一些与请求正文相关的信息。

例如:现在的 Web 应用通常采用 Restful 架构,请求的数据格式一般为 json。这时就需要设置 Content-Type: application/json。