HTTP(超文本传输协议)
- HTTP 协议是 Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网( WWW:World Wide Web )服务器传输超文本到本地浏览器的传送协议.
- 超文本代表 可以传输任意类型的数据文件包括且不限于视频 音频、文本等。
- HTTP 是一个基于 TCP/IP 通信协议来传递数据的(HTML 文件、图片文件、查询结果等)。
HTTPS(http+ssl/tls)
- HTTPS 协议是 HyperText Transfer Protocol Secure(超文本传输安全协议)的缩写,HTTPS 经由 HTTP 进行通信,但利用 SSL/TLS 来加密数据包,HTTPS 开发的主要目的,是提供对网站服务器的身份认证,保护交换资料的隐私与完整性。
- HTTP 的默认使用端口 80,而 HTTPS 的默认使用端口 443。
HTTP 工作原理
- 无连接 无连接的含义是限制每次连接只处理一个请求,服务器处理完客户的请求,并收到客户的应答后,即断开连接,采用这种方式可以节省传输时间。
- 无状态 HTTP 协议是无状态协议,无状态是指协议对于事务处理没有记忆能力,缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大,另一方面,在服务器不需要先前信息时它的应答就较快。
- 媒体独立 HTTP 是媒体独立的:这意味着,只要客户端和服务器知道如何处理的数据内容,任何类型的数据都可以通过 HTTP 发送,客户端以及服务器指定使用适合的 MIME-type 内容类型。
注释:MIME Type 是该资源的媒体类型,MIME Type 不是个人指定的,是经过互联网(IETF)组织协商,以 RFC(是一系列以编号排定的文件,几乎所有的互联网标准都有收录在其中) 的形式作为建议的标准发布在网上的,大多数的 Web 服务器和用户代理都会支持这个规范 (顺便说一句,Email 附件的类型也是通过 MIME Type 指定的)。
媒体类型通常是通过 Content-Type 来表示的。例如:Content-Type:text/HTML。
通常只有一些在互联网上获得广泛应用的格式才会获得一个 MIME Type,如果是某个客户端自己定义的格式,一般只能以 application/x- 开头。
HTTP 消息结构
客户端请求消息
客户端发送一个 HTTP 请求到服务器的请求消息包括请求行(request line)、请求头部(header)、空行和请求数据四个部分组成
- 请求行(request line)
- 请求头部(header)、
- 空行
- 请求数据
服务器响应消息
HTTP 响应也由四个部分组成,分别是:状态行、消息报头、空行和响应正文。
- 状态行
- 消息报头
- 空行
- 请求数据
HTTP Request Header 常用请求头:
Accept
-
指明了客户端可理解的 MIME type,用“,”做分隔符,列出多个类型;
Accept: "application/json,text/plain,*/*";
Accept-Encoding
-
指明客户端可理解的压缩格式
Accept-Encoding: gzip, deflate, br
Accept-Charset
-
Accept-Charset 是告诉服务器,客户端提交的表单可能使用的编码。这与服务器的响应内容编码无关。浏览器通过这个头,告诉服务器它采用的字符集编码格式
Accept-Charset: iso-8859-5
Accept-Language
-
指明客户端可接受的语言
Accept-Language: zh-CN,zh;q=0.9
Cookie
-
HTTP 请求发送时,会把保存在该请求域名下的所有 cookie 值一起发送给 web 服务器。
Cookie: kkk=s%3A100%E5%B2%81.mQ5aj6zAQP9xLB2aq2q%2BwwaLIIjOK9OU6jRdrTuoQpc
Host
-
指定请求的服务器的域名和端口号
Host: 127.0.0.1:8888
Origin
-
请求头 origin 表明了请求来自于哪个站点。包括且仅仅包括协议、域名和端口,并不包含任何路径信息。经常用于 CORS 请求或者 POST 请求,可以看到 response 有对应的 header:Access-Control-Allow-Origin。
Origin: http://127.0.0.1:5500
Authorization
-
HTTP 授权的授权证书
Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==
If-Modified-Since(协商缓存 http1.0)
-
如果请求的部分在指定时间之后被修改则请求成功,未被修改则返回 304 代码
If-Modified-Since: Sat, 29 Oct 2010 19:43:31 GMT
If-None-Match(协商缓存 http1.1)
-
如果内容未改变返回 304 代码,参数为服务器先前发送的 Etag,与服务器回应的 Etag 比较判断是否改变
If-None-Match: "737060cd8c284d8af7ad3082f209582d"
Referer
-
告知服务器请求的原始资源的 URI,其用于所有类型的请求,并且包括协议、域名、路径和查询参数。,服务器因此可以获得一些信息用于处理。(防盗链)
Referer: http://127.0.0.1:8888/list
User-Agent
-
User-Agent 的内容包含当前浏览器操作系统的信息,以及浏览器的版本号
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36
sec-ch-ua
- 可以理解用来替代 user-agent 的,用 sec-ch-ua 可以防止泄露浏览器详细信息。
sec-ch-ua: "Not?A_Brand";v="8", "Chromium";v="108", "Google Chrome";v="108"
sec-ch-ua-mobile
- 是否是移动端用户
sec-ch-ua-mobile: ?0
sec-ch-ua-platform
- 表示操作系统名称
sec-ch-ua-platform: "Windows"
Sec-Fetch-Dest
- 表示请求的目的地,即如何使用获取的数据。
Sec-Fetch-Dest: empty
Sec-Fetch-Site
- 请求发起者的来源与目标资源来源之间的关系。
Sec-Fetch-Site: cross-site
Sec-Fetch-Mode
- 该请求头表明了一个请求的模式。
Sec-Fetch-Mode: cors
HTTP Responses Header 常用响应头:
Access-Control-Allow-Origin
-
该字段是必须的。它的值要么是请求时 Origin 字段的值,要么是一个
*
,表示接受任意域名的请求。//例如 Access-Control-Allow-Origin: http://127.0.0.1:5500
Access-Control-Allow-Credentials
Access-Control-Allow-Credentials: 该字段可选。它的值是一个布尔值,表示是否允许发送 Cookie。默认情况下,Cookie 不包括在 CORS 请求之中。设为 true,即表示服务器明确许可,Cookie 可以包含在请求中,一起发给服务器。这个值也只能设为 true,如果服务器不要浏览器发送 Cookie,删除该字段即可。
```js
//例如
Access-Control-Allow-Credentials: true
```
Content-Type
-
请求的与实体对应的 MIME 信息,表示后面的文档属于什么 MIME 类型。Servlet 默认为 text/plain,但通常需要显式地指定为 text/html。
Content-Type: application/x-www-form-urlencoded
Content-Length
-
表示内容长度(字节长度)。只有当浏览器使用持久 HTTP 连接时才需要这个数据。
Content-Length: 348
Content-Encoding
-
表示服务端实际采用的压缩格式,如果相应报文没有该请求头,则代表服务端没有开启压缩;只有在解码之后才可以得到 Content-Type 头指定的内容类型。利用 gzip 压缩文档能够显著地减少 HTML 文档的下载时间。
ontent-Encoding: gzip
Content-Language
-
响应体的语言
Content-Language: zh-cn
Set-cookie 设置 cookie
-
设置 Cookie
Set-Cookie: kkk=s%3A100%E5%B2%81.mQ5aj6zAQP9xLB2aq2q%2BwwaLIIjOK9OU6jRdrTuoQpc; Max-Age=3600; Path=/; Expires=Wed, 11 Jan 2023 07:11:51 GMT; HttpOnly; Secure; SameSite=None
Connection
-
表示是否需要持久连接。(HTTP 1.1 默认进行持久连接)
Connection: close | (keep - alive(默认));
Keep-Alive
-
长连接时间
Keep-Alive: timeout=5
Cache-Control
-
告诉所有的缓存机制是否可以缓存及哪种类型 (详情可见浏览器缓存章节)
Cache-Control: no-cache
Date
-
服务器消息发出的时间
Date: Tue, 15 Nov 2010 08:12:31 GMT
ETag
-
资源唯一标识
ETag: "737060cd8c284d8af7ad3082f209582d";
Expires
-
响应过期的日期和时间
Expires: Thu, 01 Dec 2010 16:00:00 GMT
Last-Modified
-
(GMT 格式)请求资源的最后修改时间
Last-Modified: Tue, 15 Nov 2010 12:45:26 GMT
Location
-
用来重定向接收方到非请求 URL 的位置来完成请求或标识新的资源(res.location()|res.redirect())
// 1 res.setHeader("Location", "https://www.baidu.com"); resstatus(302).end(); // 2 res.location("https://www.baidu.com"); resstatus(302).end(); //3 res.redirect(302, "/newSend"); res.end();
Referer
-
可以在服务端设置该头部使页面刷新或者跳转
//5s后跳转至百度 res.setHeader("refresh", "5;url='https://www.baidu.com'"); //每2s刷新一次页面 res.setHeader("refresh", "5"); // Referer: https://www.baidu.com
Vary
- 是作为响应头由服务器端返回数据时添加的头部信息
- Vary 头的内容来自于当前请求的 Request 头部 Key
- 缓存服务器进行某接口的网络请求结果数据缓存时,会将 Vary 一起缓存;
- HTTP 请求,缓存中 Vary 的内容会作为当前缓存数据是否可以作为请求结果返回给客户端的判断依据;
- HTTP 请求,响应数据中的 Vary 用来判断当前缓存中同请求的数据的 Vary 是否失效,如果缓存中的 Vary 与服务器刚拿到的 Vary 不一致,则可以进行更新。
- 当 Vary 的值为
*
,意味着请求头中的所有信息都不可作为是否从缓存服务器拿数据的判断依据。
Vary: Origin;
X-Powered-By
- X-Powered-By:不是 Apache 或者 Nginx 输出的,而是由语言解析器或者应用程序框架输出的, 这个值的意义用于告知网站是用何种语言或框架编写的。
//例如 X-Powered-By: Express
MIME类型说明
MIME类型的格式是“大类型/小类型”,并与某一种文件的扩展名相对应
常用类型
常见的媒体格式类型如下:
- text/html : HTML格式
- text/plain :纯文本格式
- text/xml : XML格式
- image/gif :gif图片格式
- image/jpeg :jpg图片格式
- image/png:png图片格式
以application开头的媒体格式类型:
- application/xml: XML数据格式
- application/json: JSON数据格式
- application/pdf:pdf格式
- application/msword : Word文档格式
- application/octet-stream : 二进制流数据(如常见的文件下载)
- application/x-www-form-urlencoded : 中默认的encType,form表单数据被编码为key/value格式发送到服务器(表单默认的提交数据的格式)