WJCHumble / Blog

分享编程和生活(Sharing programming and life)
40 stars 1 forks source link

攻克 HTTP 基础知识,多图预警 #1

Open WJCHumble opened 3 years ago

WJCHumble commented 3 years ago

HTTP

报文

HTTP 报文可以分为请求报文响应报文

请求报文:

响应报文:

URI 和 URL

URI Uniform Resource Identifier(统一资源标识符),用字符串标识某一互联网资源

URL Uniform Resource Locator(统一资源定位符),用于表示资源的地点(即在互联网上所处的位置)

URL 是 URI 的子集

请求方法(9种)

GET

HTTP GET 方法请求指定的资源。使用 GET 的请求应该只用于获取数据。

POST

HTTP POST 方法 发送数据给服务器. 请求主体的类型由 Content-Type 实体首部字段指定.

DELETE

HTTP DELETE 请求方法用于删除指定的资源。

OPTIONS

HTTP 的 OPTIONS 方法 用于获取目的资源所支持的通信选项。客户端可以对特定的 URL 使用 OPTIONS 方法,也可以对整站(通过将 URL 设置为“*”)使用该方法。

PUT

HTTP PUT 请求方法使用请求中的负载创建或者替换目标资源。

PUT 与 POST 方法的区别在于,PUT方法是幂等的:调用一次与连续调用多次是等价的(即没有副作用),而连续调用多次POST方法可能会有副作用,比如将一个订单重复提交多次。

CONNECT

在 HTTP 协议中,CONNECT 方法可以开启一个客户端与所请求资源之间的双向沟通的通道。它可以用来创建隧道(tunnel)。

例如,CONNECT 可以用来访问采用了 SSL (HTTPS) 协议的站点。客户端要求代理服务器将 TCP 连接作为通往目的主机隧道。之后该服务器会代替客户端与目的主机建立连接。连接建立好之后,代理服务器会面向客户端发送或接收 TCP 消息流。

HEAD

HTTP HEAD 方法 请求资源的头部信息, 并且这些头部与 HTTP GET 方法请求时返回的一致. 该请求方法的一个使用场景是在下载一个大文件前先获取其大小再决定是否要下载, 以此可以节约带宽资源.

HEAD 方法的响应不应包含响应正文. 即使包含了正文也必须忽略掉. 虽然描述正文信息的 entity headers, 例如 Content-Length 可能会包含在响应中, 但它们并不是用来描述 HEAD 响应本身的, 而是用来描述同样情况下的 GET 请求应该返回的响应.

PATCH

在HTTP协议中,请求方法 PATCH 用于对资源进行部分修改。

在HTTP协议中, PUT 方法已经被用来表示对资源进行整体覆盖, 而 POST 方法则没有对标准的补丁格式的提供支持。不同于 PUT 方法,而与 POST 方法类似,PATCH 方法是非幂等的,这就意味着连续多个的相同请求会产生不同的效果。

另外一个支持 PATCH 方法的隐含迹象是 Accept-Patch 首部的出现,这个首部明确了服务器端可以接受的补丁文件的格式。

TRACE

HTTP TRACE 方法 实现沿通向目标资源的路径的消息环回(loop-back)测试 ,提供了一种实用的 debug 机制。

状态码

在 HTTP 协议中,状态码的作用是当客户端向服务端发送请求时,描述返回的请求结果。通过状态码,用户可以知道服务器是正常处理了请求,还是发生错误。

而状态码是由两个部分组成:3 位数数字、原因短语,例如 200 OK。 在状态码中,三位数字的第一个数字代表了响应的类别,具体的响应类别有以下 5 种:

  类别 原因短语
1xx 任务信息状态码 接收的请求正在处理
2xx 成功状态码 请求正常处理完毕
3xx 重定向状态码 需要进行附加操作以完成请求
4xx 客户端错误状态码 服务端无法处理请求
5xx 服务器错误状态码 服务器处理请求出错
截屏2020-11-27 下午12 17 31

1XX 任务信息

100 Continue

HTTP 状态码为 100 Continue 时,则表示目前为止请求正常, 客户端应该继续请求, 如果已完成请求则忽略。

101 Switching Protocol

HTTP 状态码为 101 Switching Protocol 时,则表示服务端根据客户端升级协议的请求(Upgrade 请求头),正在切换协议。

2XX 成功

200 OK

HTTP 状态码为 200 OK 时,则表示客户端发送的请求在服务器被正常处理了。相应地在响应报文中,会根据请求方法的不同返回不同的实体内容。例如 GET 方法请求时,对应的请求资源的实体会作为响应返回。

204 No Content

HTTP 状态码为 204 No Content 时,则表示服务器接收的请求已处理,并且在响应报文的实例中没有主体部分,即可以理解为没有返回的内容或信息。

206 Partial Content

HTTP 状态码为 206 Partial Content 时,则表示客户端对服务器发起了范围请求,并且服务器已接收并处理完成该请求,在响应报文中包含由 Content-Range 指定范围的实体内容。

3XX 重定向

301 Moved Permanently

HTTP 状态码为 301 Permanetly 时,表示请求的资源已被分配至新的 URI,以后应使用这个新的 URI 进行相应的请求。

302 Found

HTTP 状态码为 302 Found 时,同样也是表示请求的资源已被分配至新的 URI,所不同于 301 的是,它只是暂时的,即只需要这一次请求新的 URI,即可(需要注意的是 302 禁止 POST 变换成 GET)。

303 See Other

HTTP 状态码为 303 See Other 时,则表示请求的资源存在另一个 URI,应使用 GET 请求方法获得请求相应资源。

304 Not Modified

HTTP 状态码为 304 Not Modified 时,则表示服务器允许访问资源,但是由于客户端请求时未满足条件,而直接返回 304 NotModified,即在响应报文的主体中不包含任何内容。

307 Temporary Redirect

HTTP 状态码为 307 Temporary Redirect 时,与 302 相同的行为,只是它不会禁止从 POST 转为 GET。

4XX 客户端错误

400 Bad Request

HTTP 状态码为 4xx 时,表明客户端是请求资源发生错误的原因所在。

401 Unauthoried

HTTP 状态码为 400 Bad Request 时,表示请求报文中存在语法错误,即客户端需要修改请求,再次发送请求。

403 Forbidden

HTTP 状态码为 403 Forbidden 时,表示客户端发送的请求被服务器拒绝了。

404 Not Found

HTTP 状态码为 404 Not Found 时,表示服务器上找不到客户端所要请求的资源。

5XX 服务器错误

500 Internal Server Error

HTTP 状态码为 500 Internal Server Error 时,表示在请求过程中服务器发生了错误,例如可能是服务器存在 Bug 或其他临时的原因。

503 Service Unavailable

HTTP 状态码为 503 Unavailable 时,表示服务器暂时处于超负载或停机维护,此时无法处理请求。

常见首部字段(四种)

请求首部字段

首部字段名 说明
Accept 用户代理可处理的媒体类型( text/html,application/xhtml+xml 等)
Accept-Charset 优先的字符集
Accept-Encoding 优先的内容编码
Accept-Language 优先的语言
Authorization Web 认知信息
Expect 期待服务器特定的行为
From 用户的邮箱地址
Host 请求资源所在的地址
If-Match 比较实体标记(ETag,常用于 Web 应用的缓存)
If-Modified-Since 比较实体的更新时间
If-None-Match 比较实标记(和 If-Match 相反,即没有 Match 到)
If-Range 资源未更新时发送实体 Byte 范围的请求
If-Unmodified-Since 比较资源的更新时间
Max-Forwards 最大传输逐跳数
Proxy-Authorization 代理服务器要求的客户端信息
Range 实体的字节范围请求
Referer 请求 URI 的原始获取方
TE 传输编码的优先级
User-Agent HTTP 客户端程序的信息(简称 UA)

响应首部字段

首部字段名 说明
Accept-Ranges 是否接收字节范围的请求
Age 推算资源创建经过时间
ETag 资源的匹配信息
Location 令客户端重定向至指定 URI
Proxy-Authenticate 代理服务器对客户端的认证信息
Retry-After 对再次发起请求的时机要求
Server HTTP 服务器的安装信息
Vary 代理服务器缓存的管理信息
WWW-Authenticate 代理服务器对客户端的认知信息

实体首部字段

首部字段名 说明
Allow 资源可支持的 HTTP 方法
Content-Encoding 实体主体支持的编码方式
Content-Language 实体主体的自然语言
Content-Length 实体主体的大小(Byte)
Content-Location 替代资源对应的 URI
Content-MD5 实体主体的报文摘要
Content-Range 实体主体的位置范围
Content-Type 实体主体的媒体类型
Expires 实体主体过期的日期时间
Last-Modified 资源的最后修改日期时间

通用首部字段

首部字段名 说明
Cache-Control 控制缓存的行为
Date 创建报文的日期时间
Connection 逐跳首部、连接的管理
Progma 报文指令
Trailer 报文末端的首部一览
Transfer-Encoding 指定报文主体的传输编码方式
Upgrade 升级为其他协议
Via 代理服务器通知
Warning 错误通知

缓存

强缓缓存

描述:即服务端一方设定的可缓存内容,这个过程不需要沟通,只要这个缓存有效,那么你就可以去读取它。

缺点:其实这样简单的理解定义,就可以看出它的弊端,当服务端缓存的资源变了,可是浏览器缓存的资源还有效,那么这个资源的更新就没有及时同步,这无疑是不友好的。

强缓存有两种:ExpiresCache-Control

Expires

看到这个单词,应该都很容易的联想到 CookieExpires,它在 Cookie 中作用就是设置 Cookie 的有效期。同样地,在这里它是 HTTP/1 中用来描述缓存资源有效时间的 HTTP 实体首部字段,它的值为 GMT 时间,由服务端定义好通过响应报文返回给前端。

截屏2020-11-27 下午1 28 27

缺点:由服务端定义好时间,这就会发生服务端和客户端时间不一致的问题。

Cache-Control

Cache-Control 它是 HTTP/1.1 中提出用于缓存的 HTTP 通用首部字段。它则代表资源在一段时间内可以读取缓存,而不用重新请求。而与 Expires 不同,它的值为 max-age = **s,并且它还可以搭配一些指令(8 个)实现一些特定的效果:

ExpiresCache-Control 同时存在时,Cache-Control 的优先级较高

协商缓存

描述:即这个缓存的过程需要通过双方的确认,才能决定缓存资源是否可用,可用则返回状态码 304 Not Modified,不可用则返回状态码 200 OK和更新后的资源。

缺点:因为缓存的最终确定需要浏览器和服务器双方的确定,所以性能较低、耗时较长。

Last-Modified

Last-Modified 是 HTTP/1.0 中用于协商缓存的 HTTP 响应首部字段,它表示该资源的最后修改时间,它会和 If-Modified-Since 一起使用。

这个过程大致是这样的,服务端在响应报文中添加 Last-Modified 首部字段即相应的值(同样是 GMT 时间),然后浏览器在接受响应后,会将资源进行缓存和记录 Last-Modified,在下次请求相同资源的时候添加 If-Modified-Since HTTP 请求首部字段 携带之前记录的 Last-Modified 的值一起发送到服务端,服务端识别到 If-Modified-Since 字段,并与该资源上次修改的时间进行比较,如果相同则返回状态 304 Not-Modified,如果不同则发送状态码 200 OK 以及在报文实体中携带上更新过的资源。

缺点:

ETag

ETag 是 HTTP/1.1 中用于协商缓存的 HTTP 响应首部字段,它是由服务端为该资源生成的 Hash,它会和 If-No-Match 一起使用。

它的过程会是这样,服务端在响应报文中添加 ETag 首部字段及对应资源的 Hash,同样地,然后浏览器在接受响应后,会将资源进行缓存和记录 ETag,在下次请求相同资源时通过 If-No-Match HTTP 请求首部字段 携带之前记录的 ETag 的值一起发送到服务端,服务端识别到 ETag 字段,并与该资源此时的 Hash值进行比较,如果相同返回状态码 304 Not-Modified,如果不同则发送状态码 200 OK 以及在报文实体中携带上更新过的资源。

缺点:

ETagIf-Modified 同时存在时,ETag 的优先级较高

Cookie

CORS(跨域资源)

HTTPS

HTTPS = HTTP + 加密 + 完整性保护 + 身份认证

HTTP 1.x

HTTP 2.x

HTTP 3.x