Open WJCHumble opened 3 years ago
HTTP 报文可以分为请求报文和响应报文。
请求报文:
响应报文:
URI Uniform Resource Identifier(统一资源标识符),用字符串标识某一互联网资源
URL Uniform Resource Locator(统一资源定位符),用于表示资源的地点(即在互联网上所处的位置)
URL 是 URI 的子集
HTTP GET 方法请求指定的资源。使用 GET 的请求应该只用于获取数据。
HTTP POST 方法 发送数据给服务器. 请求主体的类型由 Content-Type 实体首部字段指定.
HTTP DELETE 请求方法用于删除指定的资源。
HTTP 的 OPTIONS 方法 用于获取目的资源所支持的通信选项。客户端可以对特定的 URL 使用 OPTIONS 方法,也可以对整站(通过将 URL 设置为“*”)使用该方法。
HTTP PUT 请求方法使用请求中的负载创建或者替换目标资源。
PUT 与 POST 方法的区别在于,PUT方法是幂等的:调用一次与连续调用多次是等价的(即没有副作用),而连续调用多次POST方法可能会有副作用,比如将一个订单重复提交多次。
在 HTTP 协议中,CONNECT 方法可以开启一个客户端与所请求资源之间的双向沟通的通道。它可以用来创建隧道(tunnel)。
例如,CONNECT 可以用来访问采用了 SSL (HTTPS) 协议的站点。客户端要求代理服务器将 TCP 连接作为通往目的主机隧道。之后该服务器会代替客户端与目的主机建立连接。连接建立好之后,代理服务器会面向客户端发送或接收 TCP 消息流。
HTTP HEAD 方法 请求资源的头部信息, 并且这些头部与 HTTP GET 方法请求时返回的一致. 该请求方法的一个使用场景是在下载一个大文件前先获取其大小再决定是否要下载, 以此可以节约带宽资源.
HEAD 方法的响应不应包含响应正文. 即使包含了正文也必须忽略掉. 虽然描述正文信息的 entity headers, 例如 Content-Length 可能会包含在响应中, 但它们并不是用来描述 HEAD 响应本身的, 而是用来描述同样情况下的 GET 请求应该返回的响应.
在HTTP协议中,请求方法 PATCH 用于对资源进行部分修改。
在HTTP协议中, PUT 方法已经被用来表示对资源进行整体覆盖, 而 POST 方法则没有对标准的补丁格式的提供支持。不同于 PUT 方法,而与 POST 方法类似,PATCH 方法是非幂等的,这就意味着连续多个的相同请求会产生不同的效果。
另外一个支持 PATCH 方法的隐含迹象是 Accept-Patch 首部的出现,这个首部明确了服务器端可以接受的补丁文件的格式。
HTTP TRACE 方法 实现沿通向目标资源的路径的消息环回(loop-back)测试 ,提供了一种实用的 debug 机制。
在 HTTP 协议中,状态码的作用是当客户端向服务端发送请求时,描述返回的请求结果。通过状态码,用户可以知道服务器是正常处理了请求,还是发生错误。
而状态码是由两个部分组成:3 位数数字、原因短语,例如 200 OK。 在状态码中,三位数字的第一个数字代表了响应的类别,具体的响应类别有以下 5 种:
200 OK
HTTP 状态码为 100 Continue 时,则表示目前为止请求正常, 客户端应该继续请求, 如果已完成请求则忽略。
100 Continue
HTTP 状态码为 101 Switching Protocol 时,则表示服务端根据客户端升级协议的请求(Upgrade 请求头),正在切换协议。
101 Switching Protocol
Upgrade
HTTP 状态码为 200 OK 时,则表示客户端发送的请求在服务器被正常处理了。相应地在响应报文中,会根据请求方法的不同返回不同的实体内容。例如 GET 方法请求时,对应的请求资源的实体会作为响应返回。
HTTP 状态码为 204 No Content 时,则表示服务器接收的请求已处理,并且在响应报文的实例中没有主体部分,即可以理解为没有返回的内容或信息。
204 No Content
HTTP 状态码为 206 Partial Content 时,则表示客户端对服务器发起了范围请求,并且服务器已接收并处理完成该请求,在响应报文中包含由 Content-Range 指定范围的实体内容。
206 Partial Content
Content-Range
HTTP 状态码为 301 Permanetly 时,表示请求的资源已被分配至新的 URI,以后应使用这个新的 URI 进行相应的请求。
301 Permanetly
HTTP 状态码为 302 Found 时,同样也是表示请求的资源已被分配至新的 URI,所不同于 301 的是,它只是暂时的,即只需要这一次请求新的 URI,即可(需要注意的是 302 禁止 POST 变换成 GET)。
302 Found
HTTP 状态码为 303 See Other 时,则表示请求的资源存在另一个 URI,应使用 GET 请求方法获得请求相应资源。
303 See Other
HTTP 状态码为 304 Not Modified 时,则表示服务器允许访问资源,但是由于客户端请求时未满足条件,而直接返回 304 NotModified,即在响应报文的主体中不包含任何内容。
304 Not Modified
304 NotModified
HTTP 状态码为 307 Temporary Redirect 时,与 302 相同的行为,只是它不会禁止从 POST 转为 GET。
307 Temporary Redirect
HTTP 状态码为 4xx 时,表明客户端是请求资源发生错误的原因所在。
4xx
HTTP 状态码为 400 Bad Request 时,表示请求报文中存在语法错误,即客户端需要修改请求,再次发送请求。
400 Bad Request
HTTP 状态码为 403 Forbidden 时,表示客户端发送的请求被服务器拒绝了。
403 Forbidden
HTTP 状态码为 404 Not Found 时,表示服务器上找不到客户端所要请求的资源。
404 Not Found
HTTP 状态码为 500 Internal Server Error 时,表示在请求过程中服务器发生了错误,例如可能是服务器存在 Bug 或其他临时的原因。
500 Internal Server Error
Bug
HTTP 状态码为 503 Unavailable 时,表示服务器暂时处于超负载或停机维护,此时无法处理请求。
503 Unavailable
描述:即服务端一方设定的可缓存内容,这个过程不需要沟通,只要这个缓存有效,那么你就可以去读取它。
缺点:其实这样简单的理解定义,就可以看出它的弊端,当服务端缓存的资源变了,可是浏览器缓存的资源还有效,那么这个资源的更新就没有及时同步,这无疑是不友好的。
强缓存有两种:Expires和 Cache-Control。
Expires
Cache-Control
看到这个单词,应该都很容易的联想到 Cookie的 Expires,它在 Cookie 中作用就是设置 Cookie 的有效期。同样地,在这里它是 HTTP/1 中用来描述缓存资源有效时间的 HTTP 实体首部字段,它的值为 GMT 时间,由服务端定义好通过响应报文返回给前端。
Cookie
缺点:由服务端定义好时间,这就会发生服务端和客户端时间不一致的问题。
Cache-Control 它是 HTTP/1.1 中提出用于缓存的 HTTP 通用首部字段。它则代表资源在一段时间内可以读取缓存,而不用重新请求。而与 Expires 不同,它的值为 max-age = **s,并且它还可以搭配一些指令(8 个)实现一些特定的效果:
max-age
**s
private
public
no-store
no-cache
s-maxage
max-stale
max-refresh
age
当 Expires 和 Cache-Control 同时存在时,Cache-Control 的优先级较高
描述:即这个缓存的过程需要通过双方的确认,才能决定缓存资源是否可用,可用则返回状态码 304 Not Modified,不可用则返回状态码 200 OK和更新后的资源。
缺点:因为缓存的最终确定需要浏览器和服务器双方的确定,所以性能较低、耗时较长。
Last-Modified 是 HTTP/1.0 中用于协商缓存的 HTTP 响应首部字段,它表示该资源的最后修改时间,它会和 If-Modified-Since 一起使用。
Last-Modified
这个过程大致是这样的,服务端在响应报文中添加 Last-Modified 首部字段即相应的值(同样是 GMT 时间),然后浏览器在接受响应后,会将资源进行缓存和记录 Last-Modified,在下次请求相同资源的时候添加 If-Modified-Since HTTP 请求首部字段 携带之前记录的 Last-Modified 的值一起发送到服务端,服务端识别到 If-Modified-Since 字段,并与该资源上次修改的时间进行比较,如果相同则返回状态 304 Not-Modified,如果不同则发送状态码 200 OK 以及在报文实体中携带上更新过的资源。
If-Modified-Since
Not-Modified
缺点:
304 Not-Modified
ETag 是 HTTP/1.1 中用于协商缓存的 HTTP 响应首部字段,它是由服务端为该资源生成的 Hash,它会和 If-No-Match 一起使用。
ETag
Hash
它的过程会是这样,服务端在响应报文中添加 ETag 首部字段及对应资源的 Hash,同样地,然后浏览器在接受响应后,会将资源进行缓存和记录 ETag,在下次请求相同资源时通过 If-No-Match HTTP 请求首部字段 携带之前记录的 ETag 的值一起发送到服务端,服务端识别到 ETag 字段,并与该资源此时的 Hash值进行比较,如果相同返回状态码 304 Not-Modified,如果不同则发送状态码 200 OK 以及在报文实体中携带上更新过的资源。
If-No-Match
当 ETag 和 If-Modified 同时存在时,ETag 的优先级较高
If-Modified
HTTPS = HTTP + 加密 + 完整性保护 + 身份认证
HTTP
报文
HTTP 报文可以分为请求报文和响应报文。
请求报文:
响应报文:
URI 和 URL
URI Uniform Resource Identifier(统一资源标识符),用字符串标识某一互联网资源
URL Uniform Resource Locator(统一资源定位符),用于表示资源的地点(即在互联网上所处的位置)
请求方法(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 方法请求时返回的一致. 该请求方法的一个使用场景是在下载一个大文件前先获取其大小再决定是否要下载, 以此可以节约带宽资源.
PATCH
在HTTP协议中,请求方法 PATCH 用于对资源进行部分修改。
在HTTP协议中, PUT 方法已经被用来表示对资源进行整体覆盖, 而 POST 方法则没有对标准的补丁格式的提供支持。不同于 PUT 方法,而与 POST 方法类似,PATCH 方法是非幂等的,这就意味着连续多个的相同请求会产生不同的效果。
TRACE
HTTP TRACE 方法 实现沿通向目标资源的路径的消息环回(loop-back)测试 ,提供了一种实用的 debug 机制。
状态码
在 HTTP 协议中,状态码的作用是当客户端向服务端发送请求时,描述返回的请求结果。通过状态码,用户可以知道服务器是正常处理了请求,还是发生错误。
而状态码是由两个部分组成:3 位数数字、原因短语,例如
200 OK
。 在状态码中,三位数字的第一个数字代表了响应的类别,具体的响应类别有以下 5 种: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
时,表示服务器暂时处于超负载或停机维护,此时无法处理请求。常见首部字段(四种)
请求首部字段
响应首部字段
实体首部字段
通用首部字段
缓存
强缓缓存
描述:即服务端一方设定的可缓存内容,这个过程不需要沟通,只要这个缓存有效,那么你就可以去读取它。
缺点:其实这样简单的理解定义,就可以看出它的弊端,当服务端缓存的资源变了,可是浏览器缓存的资源还有效,那么这个资源的更新就没有及时同步,这无疑是不友好的。
强缓存有两种:
Expires
和Cache-Control
。Expires
看到这个单词,应该都很容易的联想到
Cookie
的Expires
,它在Cookie
中作用就是设置Cookie
的有效期。同样地,在这里它是 HTTP/1 中用来描述缓存资源有效时间的 HTTP 实体首部字段,它的值为 GMT 时间,由服务端定义好通过响应报文返回给前端。缺点:由服务端定义好时间,这就会发生服务端和客户端时间不一致的问题。
Cache-Control
Cache-Control
它是 HTTP/1.1 中提出用于缓存的 HTTP 通用首部字段。它则代表资源在一段时间内可以读取缓存,而不用重新请求。而与Expires
不同,它的值为max-age
=**s
,并且它还可以搭配一些指令(8 个)实现一些特定的效果:private
,表示 HTTP 请求从浏览器发送到最终的服务器这个过程,只有浏览器缓存,中间任何传递节点不能缓存(代理服务器之类的)public
,表示都可以缓存,无论浏览器、服务器或者代理服务器。no-store
,表示不需要缓存。no-cache
,表示不使用强缓存,使用协商缓存。max-age
,表示缓存有效的最大时间,单位为 s。s-maxage
,表示代理服务器的缓存有效的最大时间。max-stale
,表示浏览器可接受的失效缓存的最大失效时间。max-refresh
,表示浏览器可接受的最短更新时间,不过这个时间是当前的age
加上max-refresh
。协商缓存
描述:即这个缓存的过程需要通过双方的确认,才能决定缓存资源是否可用,可用则返回状态码
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
字段,并与该资源上次修改的时间进行比较,如果相同则返回状态 304Not-Modified
,如果不同则发送状态码200 OK
以及在报文实体中携带上更新过的资源。缺点:
Last-Modified
也会随着变化,那么此时就会造成服务端返回状态码200 OK
情况和返回没有更新的资源(实际上资源并没有变化),即这个请求完全没有意义。Last-Modified
无法观察低于秒时的文件的修改,那么这就会造成文件已经更新了,但是服务端却认为它没有更新状态304 Not-Modified
,让浏览器去读缓存,即资源更新不精确。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
以及在报文实体中携带上更新过的资源。缺点:
ETag
需要服务端计算资源生成Hash
,这个过程无疑是比较慢的,所以性能较低。Cookie
CORS(跨域资源)
HTTPS
HTTPS = HTTP + 加密 + 完整性保护 + 身份认证
HTTP 1.x
HTTP 2.x
HTTP 3.x