探秘 http 请求报文结构
HTTP 请求报文由客户端发出,在发送报文之前要先与服务器建立 TCP 连接,如果使用 HTTPS 协议还需要建立 TLS/SSL 加密隧道连接,HTTP 请求报文是由三部分组成: 请求行 , 请求报头 和 请求正文 。
实例
举个例子,下面是对 www.google.com 发出的请求报文。我们可以在 Google Dev Tools 中查看。
1 | GET / HTTP/1.2 |
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。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Serendipity!
评论