0%

浏览器如何发起一个完整的HTTP请求(2)

昨天看到请求头部分,整理一些通用请求头,下面整理下常用的响应/请求头

常用的请求头部

image

1
2
3
4
5
6
7
8
9
10
11
12
13
Accept:接受类型,标示浏览器支持的MIME类型(对标服务器返回的Centent-Type)
Accept-Encoding: 浏览器支持的压缩类型,比如gzip等,超过类型不能接受
Content-Type:客户端发送出去实体内容的类型
Cache-Control:指定请求和响应遵循的缓存机制,如no-cache、no-store
If-Modified-Since:对应服务器的Last-Modified,用来匹配看文件是否变动,精确到1s
Expires:缓存控制,在这个时间内不会请求,直接使用缓存(http1.0,而且是服务器端时间)
Max-age: 代表资源在本地缓存多少秒,有效时间不会请求,而是使用缓存(http1.1)
If-None-Match:对于服务端的ETag,用于匹配文件内容是否改变(非常精确)(http1.1)
Cookie:有cookie并且同域访问时会自动带上(www.baidu.com/a.baidu.com非同域名!)
Host:请求的服务器URL
Origin:最初请求是从哪里发起的(精确到端口),Origin比Referer更遵循隐私
Referer:该页面的来源URL(适用于所有类型的请求,会精确到详细页面,csrf通常会拦截该字段)
User-Agent:用户客户端的一些必要信息

备注

no-cache:可以在本地缓存,可以代理服务器缓存,但是和这个缓存需要服务器验证以后才可以使用

no-store:禁用缓存,本地和代理服务器均不准使用,必须从服务器获取

Accept 和 Content-Type 的区别

1
2
3
Accpet属于请求头,Content-Type属于实体头
Accpet:告诉服务端,客户端接收什么类型的信息
Content-Type:发送端(客户端|服务器端)发送的实体数据的数据类型

常用的响应头

image

1
2
3
4
5
6
7
8
9
10
11
12
13
Access-Control-Allow-Hedaers:服务器端允许的Headers
Access-Control-Allow-Methods:服务器端允许的请求方法
Acees-Control-Allow-Origin:服务器端允许的请求Origin头部
Content-Type:服务器返回的实体内容类型
Data:数据从服务器发起的时间
Cache-Control:告诉浏览器或其他用户,什么环境可以安全的缓存文档
Last-Modified:请求资源的最后修改时间
Expires:文档的过期时间,删除缓存
Max-age:客户端的本地资源的缓存时间(单位-秒),开启了Cache-Contral后有效
ETag:请求标量的实体标签的当前值
Set-Cookie:设置和页面关联的cookie,服务器通过整个头部把cookie传给客户端
Keep-Alive:客户端有keep-alive,服务端也会响应(timeout=38)
Server:服务器的一些相关信息

请求头部和响应头部是彼此匹配分析的。

最常见的:
请求头部的 Accept 要和响应头部的 Content-Type 进行匹配,否则会报错。

其实我在整理之前一直在想为什么请求头部也有「Content-Type」,那为什么不是它和响应头部的「Content-Type」匹配?

后来,我整理的时候发现,「Content-Type」是实体头部,指的是:「发送端(可以使客户端,也可以是服务端),用来表明发送信息的文档类型的」,也就是说他是发送性质的,「Accept」是接受性质,so 请求头部的「Accept」和响应头部的「Cotent-Type」匹配的。

举栗子

造成跨域问题,往往是因为请求头部「Origin」要匹配响应头部的「Access-Control-Allow-Origin」,一旦匹配失败,则会报跨域错误。

在使用缓存时,请求头部的 If-Modified-Since、If-None-Match 分别和响应头部的 Last-Modified、ETag 对应

什么是实体头?

image

可以理解为「实体信息」的头部

什么是实体信息?

消息实体分为响应实体、请求实体

在 http 请求中,会将一些需要的参数放入,你比如 POST 请求。

实体信息中可以放入参数(data=ab&query=123),也可以直接通过表单对象(Form Data 对象,上传时可以带参数、文件、二进制流)

而 http 响应时候,服务端就会返回实体信息(没错,就是 reponse)

一般的接口请求,实体信息就是 JSON 格式的数据,然而接口返回的可以使 JSON 格式的数据也可以使 html,然后通过 JS 渲染

最后讲一下,CRLF

Carriage-Return Line-Feed), 回车换行符

(我也不明白这东西有什么用)

请求头和实体消息之间有一个 CRLF 分隔,响应头部和响应实体之间用一个 CRLF 分隔

一般来说(分隔符类别):

1
2
3
CRLF->Windows-style
LF->Unix Style
CR->Mac Style

结束下面附上一个 http 请求栗子

http 请求报文结构栗子:

image

再说点什么?

今天的内容其实我已经整理的差不多,两天把大牛的 http 请求,简单的整理(抄)了一遍,收获很多,之前一直不懂跨域的原理,以及 request/response 的头部匹配,基本也理解了。从 HTTP 报文结构表面来看至少看出来跨域的问题来自哪里,具体如何解决还需要仔细研究

2019 年 02 月 15 日 20:40:48
袁凯忻