之前在做web开发时使用到HTTP首部的时候遇到不熟悉的都是现用现查,时间一长印象就不深刻了。最近在重读《图解HTTP》,其中有一章是专门讲解HTTP首部的,讲解的HTTP首部很多,在这里总结了一些平常使用比较多的首部。
1. HTTP报文首部
HTTP的请求和响应报文必定包含HTTP首部。首部内容为客户端和服务器分别处理请求和响应提供所需要的信息。
1.1 HTTP请求报文
HTTP请求报文由方法、URI、HTTP版本、HTTP首部字段等部分构成。
我们可以自己通过浏览器查看请求首部信息,浏览器F12控制台选择Network,下面是我访问图灵社区网站的请求头部信息:
Request URL: http://www.ituring.com.cn/
Request Method: GET
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Cache-Control: max-age=0
Connection: keep-alive
Host: www.ituring.com.cn
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36
1.2 HTTP响应报文
HTTP响应报文由HTTP版本、状态码、HTTP首部字段3部分构成。
访问图灵社区网站的响应头部信息:
Status Code: 200 OK
Cache-Control: private
Content-Encoding: gzip
Content-Length: 25620
Content-Type: text/html; charset=utf-8
Date: Sat, 14 Apr 2018 15:07:28 GMT
Server: Microsoft-IIS/8.5
Vary: Accept-Encoding
X-AspNet-Version: 4.0.30319
X-AspNetMvc-Version: 5.2
X-Powered-By: ASP.NET
2. 四种HTTP首部字段类型
2.1 通用首部字段
请求报文和响应报文两方都会使用的首部。
2.1.1 Connection
Connection首部字段具备如下两个作用:
-
控制不再转发给代理的首部字段
请求报文和响应报文可以通过
Connection:不再转发的首部字段名
控制不再转发的首部字段 -
管理持久连接
HTTP/1.1版本的默认连接都是持久连接,客户端会在持久连接上连续发送请求。当服务器想要断开连接时则指定Connection值为Close。HTTP/1.1版本之前的HTTP版本的默认连接都是非持久连接,因此如果想要在旧版本的HTTP协议上维持持久连接,则需要显式指定Connection首部字段值为keep-alive。
Connection:keep-alive
Connection:Close
2.1.2 Upgrade
Upgrade字段用于检测HTTP协议以及其他协议是否可使用更高的版本进行通信,或者是否可以切换到其他协议进行通信。Upgrade字段产生作用的Upgrade对象仅限于客户端和邻接服务器之间,因此使用首部字段Upgrade时,需要额外指定Connection:Upgrade,此时Connection起到的作用就是前面提到的“控制不再转发给代理的首部字段”。对于附有首部字段Upgrade的请求,服务器可用101状态码作为响应返回。
关于Upgrade字段,最常用的场景就是由HTTP协议升级为Websock协议时,之前我还对这个过程进行了抓包分析,感兴趣的同学或者对Websock协议不是很了解的同学可以移步我之前的一篇博客原来你是这样的Websocket--抓包分析。
2.2 请求首部字段
从客户端向服务器发送请求报文时使用的首部。
2.2.1 Accept
Accept首部字段可通知服务器,用户代理能够处理的媒体类型及媒体类型的相对优先级。可以使用type/subtype这种形式,一次指定多种媒体类型。若想要给媒体类型显式增加优先级,则使用q=来额外表示权重值,用(;)进行分隔。权重范围为0~1,默认权重为q=1.0。
2.2.2 Authorization
首部字段Authorization是用来告知服务器,用户代理的认证信息(证书值)。通常在需要认证的网络资源中,没有附加Authorization字段或Authorization字段值错误的请求,会被认为是非法请求,响应状态码为401。在Token认证方式下,客户端就是通过Authorization字段将Token值告知服务器的。
2.2.3 Host
首部字段Host会告知服务器,请求的资源所处的互联网主机名和端口号。Host首部字段在HTTP/1.1规范内是唯一一个必须被包含在请求内的首部字段。首部字段Host和单台服务器分配多个域名的虚拟主机的工作机制有很密切的联系,这是首部字段Host必须存在的意义。
2.2.4 Referer
首部字段Referer会告知服务器请求的原始资源的URI。
2.2.5 User-Agent
首部字段User-Agent会将创建请求的浏览器和用户代理名称等信息传达给服务器。
2.3 响应首部字段
从服务器向客户端返回响应报文时使用的首部。
2.3.1 Location
使用首部字段Location可以将响应接收方引导至某个与请求URI位置不同的资源。该字段会配合3XX:Redirection的响应,提供重定向的URI。几乎所有的浏览器接收到包含首部字段Location的响应后,都会强制性的尝试对已提示的重定向资源的访问。
2.3.2 Server
首部字段Server告知客户端当前服务器上安装的HTTP服务器应用程序的信息。
2.3.3 WWW-Authenticate
首部字段WWW-Authenticate用于HTTP的访问认证。它会告知客户端用于访问请求的URI所指定资源的认证方案(Basic或Digest)和带参数提示的质询。状态码401 Unauthorized响应中,肯定带有首部字段WWW-Authenticate。
2.4 实体首部字段
请求报文和响应报文的实体部分使用的首部。
2.4.1 Allow
首部字段Allow用于通知客户端能够支持Request-URI指定资源的所有HTTP方法。当服务器收到不支持的HTTP方法时,会以状态码405 Method Not Allowed 作为响应返回。与此同时,还会把所有能支持的HTTP方法写入首部字段Allow后返回。
2.4.2 Content-Length
首部字段Content-Length表明了实体主体部分的大小(单位是字节)。
2.4.3 Content-Location
首部字段Content-Location给出与报文主体部分相对应的URI。和首部字段Location不同,Content-Location表示的是报文主体返回资源对应的URI。目的是为了当返回的页面内容和实际请求的对象不同时,Content-Location内会写明URI。
2.4.3 Content-Type
首部字段Content-Type说明了实体主体内对象的媒体类型。字段值采用type/subtype形式赋值。
这个字段我们实际接触是比较多的,当使用网络接口调试工具调试接口时就需要选择Content-Type,例如指定使用json媒体格式Content-Type:Application/json;charset=UTF-8
。
本文为博主学习感悟总结,水平有限,如果不当,欢迎指正。
如果您认为还不错,不妨点击一下下方的【推荐】按钮,谢谢支持。
转载与引用请注明出处。