目录
2.2 Content-Length & Content-Type
1. 引言
上一篇博客为大家讲解了 HTTP 请求中首行的内容(请求方法, URL, 版本号), 这篇博客, 就来和大家聊一聊 HTTP 请求中 header 和 body 中的相关内容.
2. header 请求头
HTTP 请求中的 header 采用的是键值对结构, 通过键和值的形式来管理相关数据.
并且, header 中的键和值都是 RFC 文档中标准规定的(不是由程序员的自定义的).
一个请求的 header 会分成很多行, 每一行表示一个键值对, 键和值之间使用 冒号+空格 进行分割:
接下来, 就和大家一起聊一聊 header 中常见的键值对.
2.1 Host
- Host: 表示当前请求访问的服务器主机的IP地址(域名)和端口号
Host 的值在大多数的情况下和 URL 中的要访问的域名和端口号是一样的, 都是用来表示要访问的服务器端的位置.
同样, 没写端口号是因为端口号被默认指定了(默认值是啥取决于协议):
- http => 80
- https => 443
但是这里有一个问题, 既然 URL 中已经有了要访问的服务器的地址, 为啥还要在 Host 中再存一遍呢???
答: 大多数的情况下, Host 中的值和 URL 中的地址是相同的, 但是也存在特殊情况——在使用代理的情况下.
当使用代理时, 客户端发送的请求会先经过代理处理后, 再发送给服务器, 而 "代理", 很有可能会修改 URL 中写入的值, 而代理是无法修改的 Host 中的值的.
所以, 即使使用了代理, 也可以通过 Host 来获取并得知这个请求最原始的目标是谁. (可以将 Host 理解为 "不忘初心, 牢记使命"~~)
此外, Host 还可以用来进行数据校验工作:
HTTP 协议中, 传输的时候可能会涉及到 "加密"(HTTPS), 而加密的只是 header 和 body 中的内容, URL 部分是不会被加密的.
所以, 当服务器收到请求后, 可以将 header 中加密的内容和 URL 中未加密的内容进行一次校验, 检查数据是否一致.
注意: HTTPS 只能保证数据在传输过程中是安全的, 当数据到了服务器上后, 要想保证数据不被黑客攻击导致拖库, 还要在业务层进行加密.
2.2 Content-Length & Content-Type
- Content-Length: 表示请求中 body 的数据长度, 单位是字节
- Content-Type: 表示请求中 body 的数据格式
header 中是否有这俩属性, 取决于报文中是否有 body.
在请求和响应中, 都会涉及到这两个属性, 当 http 报文中没有 body 时, header 中便没有这俩属性, 但是当有 body 时, 这俩属性必须同时都有.
换句话说, 如果有 body, 但是没有这俩属性, 或者只有1个, 都会认为这是一个非法/错误的 http 报文.
2.2.1 Content-Length
Content-Length 表示请求中 body 的数据长度, 单位是字节.
为什么当有 body 时需要 Content-Length 来标识一个 http 报文的长度呢??
要知道, HTTP 协议, 在传输层是基于 TCP 协议实现的(版本号 <= 2.0). 在应用层时, 字符串会按照 http 约定的格式来进行构造, 当构造完成后, 向下传输给传输层, 数据写入到 TCP socket 中再发送给服务端.
我们知道, TCP 是面向字节流的, 并且一个 TCP 连接会有多个请求, 而服务器接收数据的时候, 就需要判断一下, 从哪到哪是一个完整的数据, 这时 Content-Length 就会派上