今天我们看下几个报文交换的例子,大家也可以去抓本站的报文,本站已经全面开启h2
协议。
GET 请求
一个简单的GET
请求,HTTP 1.1 报文如下:
GET /resource HTTP/1.1
Host: example.org
Accept: image/jpeg
看看H2
的报文:
HEADERS
+ END_STREAM
+ END_HEADERS
:method = GET
:scheme = https
:path = /resource
host = example.org
accept = image/jpeg
首先我们在H2
的报文上,先指定报文的类型,为HEADERS
(type=0x1),参考我们的帧格式,接下来我们就要指定一个标记位,
标记位在帧类型的定义中有说明,我们这里因为只是请求一个资源,所以包只有一个。
接下去带:
的是我们的"伪头(Pseudo-Header)",它并不属于HTTP HEADER
的范畴,,我们不可以自己去生成未定义的"伪头",也不可以出现在Response
里,也不会出现在非首包的位置。
接下去就是我们真正的HTTP Header
了,里面定义了一些业务相关的参数,供HTTP
服务器去解析和使用。
Response
的HTTP 1.1
版本:
HTTP/1.1 304 Not Modified
ETag: "xyzzy"
Expires: Thu, 23 Jan ...
HTTP 2
版本:
HEADERS
+ END_STREAM
+ END_HEADERS
:status = 304
etag= "xyzzy"
expires = Thu, 23 Jan ...
这是一个简单的GET
请求,然后我们看一下POST
POST
HTTP 1.1
请求:
POST /resource HTTP/1.1
Host: example.org
Content-Type: image/jpeg
Content-Length: 123
{binary data}
HTTP 2
请求:
HEADERS
- END_STREAM
- END_HEADERS
:method = POST
:path = /resource
:scheme = https
CONTINUATION
+ END_HEADERS
content-type = image/jpeg
host = example.org
content-length = 123
DATA
+ END_STREAM
{binary data}
这里唯一不同的是,我们看到了CONTINUATION
包,只要不加END_HEADERS
我们的header
可以分很多帧去提交。
我们看下Response
in HTTP 1.1
:
HTTP/1.1 200 OK
Content-Type: image/jpeg
Content-Length: 123
{binary data}
in HTTP 2
:
HEADERS
- END_STREAM
+ END_HEADERS
:status = 200
content-type = image/jpeg
content-length = 123
DATA
+ END_STREAM
{binary data}
最简单的帧交换例子就是这样,HTTP的组成部分仍然没有变化,由HEADER
和BODY
组成,而BODY
可选。
关注TalkWithMobile,关注我
本文由 Gemini Wen 创作,采用 知识共享署名4.0 国际许可协议进行许可
本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名
最后编辑时间为: Dec 21, 2020 at 08:19 pm