request header - 请求伪标头字段

3,989 阅读5分钟

前言

之前 我们介绍了 general 部分的字段,它简明扼要的揭示了 HTTP 请求的要素:请求方法,地址,状态,来源。接下来我们慢慢看request header 和 response header 里分别有什么吧!本篇文章主要说了 request header 的抽象意义和其中的伪标头字段。

request header 概述

首先我们要明白一件事:request header 部分(以下简称 RH)是从浏览器端发送到服务器端的,既然是携带给别人看的,那很自然的,我们可以想到,这些字段很可能就是浏览器的“个人信息”和对于服务器来说的有用信息。比如浏览器内核版本(whoami),支持的传输方式,能解析的文件类型等。所以,我们要理解RH里面会有什么,就要理解本次请求的目的是什么。它们并不是互相孤立,而是相辅相成的。之后我们会出一些例子来说明,本篇文章暂时以 typedocument 的请求来作为学习🌰。

:authority & :method & :path & :scheme

request01.png

这几个带冒号的字段都是什么东西?是不是一头雾水?别急,Google 一下—— 我回来了,闪开,下面我要开始装杯了

首先,他们被统一称为 Request Pseudo-Header Fields (请求伪标头字段),都是 HTTP2.0 新来的,

  • :method 字段包括 HTTP 方法,对应图上就是 GET 方法,也对应上一篇文章中的其他方法。
  • :scheme 字段包括目标 URI 的 scheme 部分。什么意思呢,就是上一篇文章中提到的URI 的标准格式的一部分,好,回顾一下(好吧上一篇文章写的是中文

URI.png

  • 简单理解就是表明请求类型是 http 还是 https 还是上一篇文章中提到的 curl 支持的其他协议

    当代理或网关转换非 HTTP 协议的请求,那么 HTTP 能够与非 HTTP 服务进行交互。

  • :authority 字段大致等同于HTTP1.1 的 Host 字段,都是用来指明请求将要发送到的服务器主机名和端口号,没有端口号则是用默认端口号(80/443)

    为确保 HTTP/1.1 请求行可以准确再现,当从具有源或星号形式的请求目标的 HTTP/1.1 请求转换时,必须省略此伪标头字段。直接生成 HTTP/2 请求的客户端应该使用 :authority 伪头字段而不是 Host 头字段。如果请求中不存在主机头字段,则将 HTTP/2 请求转换为 HTTP/1.1 的中介必须通过复制 :authority 伪头字段的值来创建主机头字段。

  • :path 伪标头字段包括目标 URI 的路径和查询部分(绝对路径产生式和可选的“?”字符,后跟查询产生式。星号形式包含:path伪标题字段的值“*” 。

    对于 http 或 https URI,此伪标头字段不得为空;不包含路径组件的 http 或 https URI 必须包含值“/”。此规则的例外是对不包含路径组件的 http 或 https URI 的 OPTIONS 请求;这些必须包含一个值为 '*' 的 :path 伪标头字段。

总的来说,这四个字段就是来描绘 URI 的,见上图。而且所有 HTTP/2 请求必须包含一个有效的:method、:scheme和:path伪标头字段值,除非它是一个 CONNECT 请求。省略强制性伪标头字段的 HTTP 请求格式不正确。

扩展一下 HTTP Header Fields(HTTP标头字段)

本段只是为了说明这几个标头的一些细节,比如说比较的细节,比如说摆放的顺序,全来自于 RFC 文档,大家可以自行选择观看。

放一首 bgm 慢慢看吧:come and get your love

HTTP 标头字段以一系列键值对的形式携带信息。有关已注册 HTTP 标头的列表,请参阅 < www.iana.org/assignments… > 维护的“消息标头字段”注册表。

就像在 HTTP/1.x 中一样,标头字段名称是 ASCII 字符串,它们以不区分大小写的方式进行比较。但是,在 HTTP/2 中编码之前,必须将标头字段名称转换为小写。包含大写标题字段名称的请求或响应必须被视为格式错误。

HTTP/1.x 使用消息start-line来表示目标 URI、请求方法、响应代码等。所有的 HTTP 消息要么是客户端到服务器的请求,要么是服务器到客户端的响应。这两种类型由它们的 来区分start-line,即request-line用于请求或status-line响应。

但是 HTTP/2 使用以 ':' 字符 (ASCII 0x3a) 开头的特殊伪标头字段来实现此目的。这些伪标头是严格定义的。有请求伪标头字段和响应伪标头字段。请求伪标头字段是上面几个,响应伪标头字段有 :status ,对于 HTTP2 请求这个伪头字段必须包含在所有响应中;否则,响应格式错误。

服务器和客户端都不能生成文档以外的伪标头。

伪标头字段仅在定义它们的上下文中有效。为请求定义的伪标头字段不得出现在响应中;为响应定义的伪标头字段不得出现在请求中。伪标头字段不得出现在 option 方法中。端应用必须将包含未定义或无效伪标头字段的请求或响应视为格式错误。

所有伪头字段必须出现在头块中的常规头字段之前。任何包含出现在常规头字段之后的头块中的伪头字段的请求或响应必须被视为格式错误。

HTTP/2 不会使用连接头字段去标识特定的连接头字段。在这个协议中,特定的连接元数据是通过其他的方法进行传输的。端点禁止生成一条包含有特定连接头字段的消息。任何包含有特定连接头字段的消息就会被视为格式错误。

更多请看: RFC 7540 8.1.2 HTTP Header Fields

ps: 发现内容真的太多了,不能着急写,慢慢学,循序渐进的写吧,大家也慢慢看就是,晚安。

ps的ps:我正在参与掘金技术社区创作者签约计划招募活动,点击链接报名投稿