http报文的知识可以说是承前启后关键点,包含了http请求类型以及http版本等基础知识。较为复杂-分为上下两部分 如果基础比较薄弱,建议简单了解一下本系列的前几篇文章再这篇文章
http报文
http报文,即网络
中两个终端
(电脑)之间遵守http协议
进行数据交互的信息
。
通用报文结构
下面说到的请求,也可以换成响应
--报文组成
- 报文具体是多行字符串
- 报文组成:请求行、请求头部、空行、请求包体
起始行
和头部字段
并成为请求头
或者响应头
,统称为Header
头部字段
的结构是常见键值对
形式空行
的通常是作为结尾的标志,所以get请求
没有实体但是还是需要空行。请求包体
也叫做实体
、消息正文
和body
- 发送http报文时可以没有
body
,但是必须要有header
,而他们之间的空行
是必须的--该图片引用自www.jianshu.com/p/291e36358… ,仅用于学习,侵权必删--
- 每个报文的
起始行
都是由三个字段组成:方法、URL路由和 HTTP 版本字段。url就是浏览器中地址栏内的字符串(发起请求时url参数:http+ip地址+端口号+路由
?参数)。
GET /index.html HTTP/1.1
我们可以测试,使用xhr发送一个http请求,打开开发者管理工具,进入network选项面板,然后可以看到我们的请求信息,方法method、url字段和http版本字段(Protocol)。(如果没有对应列,可以右键Header Options选择要显示的信息)
请求头部
组成复杂,选择常用的组成进行讲解是最好的,未讲解到的部分遇到可以自行查询。
--头部字段
我们将上面图片中的http请求选中,右侧会出现详细信息:
1. Host
主机名
请求的主机名,通常和url中的主机名一致。
2. Content-type
请求实体的数据类型标识
告诉请求的接收方请求的body如何解析。(详细请看 写篇文章之计网——(6)HTTP Content-type)
3. User-Agent
用户代码模式
请求通过这个信息字段告诉服务器你是通过什么工具(浏览器、其他程序)发送的请求。如下图,字段由 Mozilla/5.0(默认)
+平台信息
+浏览器引擎版本
+浏览器版本
四个部分组成。
部分参考:HTTP请求头之User-Agent
----Mozilla/5.0
由于历史上的浏览器大战,当时想获得图文并茂的网页,就必须宣称自己是 Mozilla
浏览器。此事导致如今User-Agent
里通常都带有Mozilla
字样,出于对历史的尊重,大家都会默认填写该部分。
----平台信息
平台这部分可由多个字符串组成,用英文半角分号分开。
这里图片可以分析:Windows NT 10.0
是☞操作系统的版本,对应的是win10
,而Win64; x64是☞操作系统是64位的。(具体可以自行查询)
----浏览器引擎版本
解释: AppleWebKit/537.36 (KHTML, like Gecko)...Safari/537.36,历史上,苹果依靠了WebKit内核开发出Safari浏览器,WebKit包含了WebCore引擎,而WebCore又从KHTML衍生而来。由于历史原因,KHTML引擎需要声明自己是“类似Gecko”的,因此引擎部分这么写。再后来,Google开发Chrome也是用了WebKit内核,于是也跟着这么写。借用Littern的一句话:“Chrome 希望能得到为Safari编写的网页,于是决定装成Safari,Safari使用了WebKit渲染引擎,而WebKit呢又伪装自己是KHTML,KHTML呢又是伪装成Gecko的。同时所有的浏览器又都宣称自己是Mozilla。”。不过,后来Chrome 28某个版本改用了blink内核,但还是保留了这些字符串。而且,最近的几十个版本中,这部分已经固定,没再变过。
----浏览器版本
Chrome/92.0
.4515.159 Safari/537.36,其中标准信息为浏览器名字
和版本号
,4515是持续增大的一个数字,而159则是修补漏洞的小版本。不深入的话学到这里就可以了。
4. Connection
后续连接
该字段信息告诉服务器连接(一次三次握手和四次挥手)的后续动作,这里使用keep-alive
☞的是保持持续连接
,http 1.1
下服务器会在没有请求一段时间后自动断开网络连接;而close
☞的是非持久连接
,它要求服务器在发送完响应的对象后就关闭连接。只有这两种。
5. Accept
指定 MIME 类型
MIME (Multipurpose Internet Mail Extensions) 是描述消息内容类型的因特网标准。MIME 消息能包含文本、图像、音频、视频以及其他应用程序专用的数据。
Accept:*/*
的意思就是支持任意的类型,具体的类别和写法自信查询,罗列大量参数未必助于理解。下面只给予一行☞定支持类型的示例:
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
6. Content-Length
实体大小
☞示实体body的大小,以字节为单位。这里的实体bodyForm Data
为:name:juejinjin age:12
,所以我们看到Content-Length: 21 。
剩下部分头部字段我们在区分
请求
和响应
报文时讲解。
浏览器-客户端向服务端发送的是http报文;服务器-服务端向客户端发送的也是http报文。虽然都是遵守http协议规范,但是具体的标准并不一致。
请求报文
由客户端向服务端发送的http报文叫做请求报文
,我们一般常说的都是请求报文(http请求)。
起初网站只有静态html文件,从客户端发送的http报文负责请求
服务端发送网页资源到客户端(浏览器渲染绘制),所以这个http报文叫作“请求”可以说是十分形象。
请求报文起始行
叫请求行
。
--请求报文的头部字段补充
7. Accept-Encoding
压缩编码
☞定了对实体body
的编码方式。网络连接后发送过程中实体body
是该编码方式存在。
该字段的常见编码:gzip、compress、deflate、identity
区别于请求报文,响应报文的对应字段名是Content-Encoding
8. Accept-Language
自然语言集
http
请求告诉服务器浏览器能接受的自然语言集,即人类听说读写的语言,中文、英文。
》截取上面get
请求图片中的信息:(权重值 q
来表示相对优先级,不细讲)
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
9. cookie
字段
满足domain参数
对应服务器域名
时请求会自动携带cookie
信息,通过头部字段
中的cookie字段
进行携带。
get 和post
-
在
请求行
的中请求方法
,区别是get
和post
(还有其他请求方式
) -
在
请求报文
结构上get不包含请求实体
,post包含。
官方要求,
GET
请求不应携带请求体,服务器应忽略(或者说丢弃)GET
请求的请求体。但是作为规范,具体的实现是可以不遵守的。postman软件以前是不支持get
请求使用body,现在支持了不代表是规范的。
响应报文留到下篇文章讲解