HTTP 实用指南学习 | 青训营笔记
这是我参与「第四届青训营 」笔记创作活动的的第6天
一.HTTP
1.HTTP:超文本传输协议
- 请求报文由请求行(请求方法、请求url、请求协议及版本)、请求头、空行、请求体组成
- 响应报文由状态行(报文协议及版本、状态码及状态描述)、响应头、空行、响应体组成
2.HTTP主要特点
简单 快速 灵活 无状态 无连接
3.发展
-
HTTP0.9 请求get方法 响应体只有HTML
-
HTTP1.0 增加了Header 有了状态码 支持多种数据格式
-
HTTP1.1 标准化协议,传输的是文本 链接复用 、缓存、内容协商
4. HTTP2 传输快速 稳定
- 传输的是帧数据,二进制分帧:HTTP2.0 会将所有的传输信息分割为更小的信息或者帧,并对他们进行二进制编码。
- 首部压缩,加入了压缩算法使传输效率更高
- 服务器推送的能力:客户端请求一个文件,文件中包含其他资源的引用 那么在客户端还没有请求的情况下 服务端会将这些被引用的文件提前push给客户端
- 提升访问速度(可以对于,请求资源所需时间更少,访问速度更快,相比 http1.0)
- 允许多路复用:多路复用允许同时通过单一的 HTTP/2 连接发送多重请求-响应信息。
- 改善了:在 http1.1 中,浏览器客户端在同一时间,针对同一域名下的请求有一定数量限制(连接数量),超过限制会被阻塞。
- 请求拆成若干个帧,然后不需要按照逻辑顺序传输 进行交替发送 接受方根据标记信息组织,提高了传输效率
- 连接是永久的
- 进行流控制,阻止发送方向接收方发送大量数据
帧:数据的二进制编码,进行分割
消息:把这些帧组合起来,是帧的聚合
数据流:是双向字节流,用于承载消息
- HTTP3
4.HTTP请求方法
- get用于获取数据,不会修改服务器的方法
- post用于提交数据,会使服务器中数据发生变化
- put用请求有效载荷替换目标资源的所有当前表示,不会修改服务器的方法
- delete删除指定的资源
- head与get方法相同,没有响应体,不会修改服务器的方法
- connect建立一个由目标资源标识的服务器的隧道
- options用于描述目标资源的通信选项
- trace眼到目标资源的路径执行一个消息换回测试
- patch用于对资源应用的部分修改
get与post区别
get:通过url传递、参数类型只接受ASCII、参数暴露在url不安全、浏览器对url传参有限制、参数会保留在浏览器里(缓存)、url可以被收藏、只能进行URI编码、浏览器回退无害
post:通过请求体请求、参数类型没有限制、参数传输安全、浏览器不会对url传参有限制、参数不会会保留在浏览器里(不主动缓存)、url不可以被收藏、支持多种编码、浏览器回退会发起新请求
为什么要发送options请求
分析登录场景:为什么用options请求?一般【复杂场景下】有跨域请求的时候,会发起一个预请求。问服务端是否可以访问。
fetch 发送 post 请求的时候,总是发送 2 次,第一次状态码是 204
用 fetch 的 post 请求的时候,导致 fetch 第一次发送了一个Options 请求,询问服务器是否支持修改的请求头,如果服务器支持,则在第二次中发送真正的请求。
5.HTTP状态码
- 100 Continue 继续。客户端应继续其请求
- 101 Switching Protocols 切换协议。服务器根据客户端的请求切换协议。只能切换到更高级的协议,例如,切换到 HTTP 的新版本协议
- 200 OK 请求成功。一般用于 GET 与 POST 请求
- 201 Created 已创建。成功请求并创建了新的资源
- 202 Accepted 已接受。已经接受请求,但未处理完成
- 203 Non-Authoritative Information 非授权信息。请求成功。但返回的 meta 信息不在原始的服务器,而是一个副本
- 204 No Content 无内容。服务器成功处理,但未返回内容。在未更新网页的情况下,可确保浏览器继续显示当前文档
- 205 Reset Content 重置内容。服务器处理成功,用户终端(例如:浏览器)应重置文档视图。可通过此返回码清除浏览器的表单域
- 206 Partial Content 部分内容。服务器成功处理了部分 GET 请求
- 300 Multiple Choices 多种选择。请求的资源可包括多个位置,相应可返回一个资源特征与地址的列表用于用户终端(例如:浏览器)选择
- 301 Moved Permanently 永久移动。请求的资源已被永久的移动到新URI,返回信息会包括新的 URI,浏览器会自动定向到新 URI。今后任何新的请求都应使用新的 URI 代替
- 302 Found 临时移动。与 301 类似。但资源只是临时被移动。客户端应继续使用原有 URI
- 303 See Other 查看其它地址。与 301 类似。使用 GET 和 POST 请求查看
- 304 Not Modified 未修改。所请求的资源未修改,服务器返回此状态码时,不会返回任何资源。客户端通常会缓存访问过的资源,通过提供一个头信息指出客户端希望只返回在指定日期之后修改的资源
- 305 Use Proxy 使用代理。所请求的资源必须通过代理访问
- 306 Unused 已经被废弃的 HTTP 状态码
- 307 Temporary Redirect 临时重定向。与 302 类似。使用 GET 请求重定向
- 400 Bad Request 客户端请求的语法错误,服务器无法理解
- 401 Unauthorized 请求要求用户的身份认证
- 402 Payment Required 保留,将来使用
- 403 Forbidden 服务器理解请求客户端的请求,但是拒绝执行此请求
- 404 Not Found 服务器无法根据客户端的请求找到资源(网页)。通过此代码,网站设计人员可设置"您所请求的资源无法找到"的个性页面
- 405 Method Not Allowed 客户端请求中的方法被禁止
- 406 Not Acceptable 服务器无法根据客户端请求的内容特性完成请求
- 407 Proxy Authentication Required 请求要求代理的身份认证,与
- 401 类似,但请求者应当使用代理进行授权
- 408 Request Time-out 服务器等待客户端发送的请求时间过长,超时
- 409 Conflict 服务器完成客户端的 PUT 请求是可能返回此代码,服务器处理请求时发生了冲突
- 410 Gone 客户端请求的资源已经不存在。410 不同于 404,如果资源以前有现在被永久删除了可使用 410 代码,网站设计人员可通过 301 代码指定资源的新位置
- 411 Length Required 服务器无法处理客户端发送的不带 ContentLength 的请求信息
- 412 Precondition Failed 客户端请求信息的先决条件错误413 Request Entity Too Large 由于请求的实体过大,服务器无法处理,因此拒绝请求。为防止客户端的连续请求,服务器可能会关闭连接。如果只是服务器暂时无法处理,则会包含一个 Retry-After 的响应信息
- 414 Request-URI Too Large 请求的 URI 过长(URI 通常为网址),服务器无法处理
- 415 Unsupported Media Type 服务器无法处理请求附带的媒体格式
- 416 Requested range not satisfiable 客户端请求的范围无效
- 417 Expectation Failed 服务器无法满足 Expect 的请求头信息
- 500 Internal Server Error 服务器内部错误,无法完成请求
- 501 Not Implemented 服务器不支持请求的功能,无法完成请求
- 502 Bad Gateway 作为网关或者代理工作的服务器尝试执行请求时,从远程服务器接收到了一个无效的响应
- 503 Service Unavailable 由于超载或系统维护,服务器暂时的无法处理客户端的请求。延时的长度可包含在服务器的 Retry-After 头信息中
- 504 Gateway Time-out 充当网关或代理的服务器,未及时从远端服务器获取请求
- 505 HTTP Version not supported 服务器不支持请求的 HTTP 协议的版本,无法完成处理
6.常用请求头
- Accept可接受的响应内容类型(Content-Types)。
- Accept-Charset可接受的字符集
- Accept-Encoding可接受的响应内容的编码方式。
- Accept-Language可接受的响应内容语言列表。
- Accept-Datetime可接受的按照时间来表示的响应内容版本
- Authorization用于表示 HTTP 协议中需要认证资源的认证信息
- Cache-Control用来指定当前的请求/回复中的,是否使用缓存机制。
- Connection客户端(浏览器)想要优先使用的连接类型
- Cookie由之前服务器通过 Set-Cookie(见下文)设置的一个 HTTP 协议
- Content-Length以 8 进制表示的请求体的长度
- Content-MD5 请求体的内容的二进制 MD5 散列值(数字签名),以 Base64 编码的结果
- Content-Type请求体的 MIME 类型 (用于 POST 和 PUT 请求中)
- If-Match仅当客户端提供的实体与服务器上对应的实体相匹配时,才进行对应的操作。主要用于像 PUT 这样的方法中,仅当从用户上次更新某
- 个资源后,该资源未被修改的情况下,才更新该资源。
- If-ModifiedSince允许在对应的资源未被修改的情况下返回 304 未修改
- If-None-Match允许在对应的内容未被修改的情况下返回 304 未修改(304 Not Modified ),参考 超文本传输协议 的实体标记
7.常用响应头
- Content-Type
- Content-Encoding
- Cache-control
- expires
- last-modified
- connection
- etag
8.强缓存和协商缓存
- 强缓存:从缓存取 返回200(from cache),强缓存相关字段有 expires,cache-control。如果 cache-control 与 expires 同时存在的话,cache-control 的优先级高于 expires。
- 协商缓存:从缓存取 返回304(not modified) 通过服务器来告知缓存是否可用,因此是必要的 可以知道是否服务器端有可用的确认信息.协商缓存就是要和服务端验证一些,通信之后确认是否过期是否可以使用。协商缓存相关字段有 Last-Modified/If-Modified-Since,Etag/If-None-Match
9.cookie
1.cookie是实现持久化的一种方式,本质是一段文本信息
- cookie 数据始终在同源的 http 请求中携带(即使不需要),即 cookie 在浏览器和服务器间来回传递。
- cookie 只在设置的 cookie 过期时间之前一直有效,即使窗口或浏览器关闭。
- cookie 数据还有路径(path)的概念,可以限制 cookie 只属于某个路径下,存储的大小很小只有 4K 左右。
2.作用
保存用户登录状态。例如将用户 id 存储于一个 cookie 内,这样当用户下次访问该页面时就不需要重新登录了,现在很多论坛和社区都提供这样的功能。 cookie 还可以设置过期时间,当超过时间期限后,cookie 就会自动消失。因此,系统往往可以提示用户保持登录状态的时间:常见选项有一个月、三个 月、一年等。
跟踪用户行为。例如一个天气预报网站,能够根据用户选择的地区显示当地的天气情况。
10.HTTP 与HTTPS
HTTP
- 是超文本传输协议
- 无状态、无连接
- 明文传输 不安全
- 端口号80
- 无证书 HTTPS
- 是安全超文本传输协议
- 基于连接连接
- 经过TSL/SSL加密 不安全
- 端口号443
- 有证书
二 跨域
1.同源策略
一种安全标准。是要协议、主机名、端口号一致
2.跨域解决方案
- jsonp
- location.hash+iframe
- window.name+iframe
- document.domain
- postMessage
- WebSocket
- CORS
- 反向代理
- Webpack本地代理
- 中间件代理
三 场景分析
1.登录鉴权
- HTTP是无状态请求,为什么还能记住用户的登录信息,当登陆后刷新页面还不会丢失?因为会在服务端生成session等信息存储起来 也会存储到本地 自动携带cookie等信息策略就可以实现
- 也有另一种token的方式
- 单点登录
2.用户体验
- HTTP2
- CDN动态加载:优先获取离用户请求最近的服务器 查询并响应;以高效的方式为用户提供请求服务
- 稳定性
- 缓存
- HTTPS安全
https 协议的工作原理 - 客户使用 https url 访问服务器,则要求 web 服务器建立 ssl 链接。
- web 服务器接收到客户端的请求之后,会将网站的证书(证书中包含了公钥),返回或者说传输给客户端。
- 客户端和 web 服务器端开始协商 SSL 链接的安全等级,也就是加密等级。
- 客户端浏览器通过双方协商一致的安全等级,建立会话密钥,然后通过网站的公钥来
- 加密会话密钥,并传送给网站。
- web 服务器通过自己的私钥解密出会话密钥。
- web 服务器通过会话密钥加密与客户端之间的通信。 QUC quick udp internet connection
- 基于UDP封装的新版本协议,不耗时的优秀特性
- TCP可靠传输 是HTTP3草案的一部分,应用还不是很多
TCP与UDP - (1)TCP 是面向连接的,udp 是无连接的即发送数据前不需要先建立链接。
- (2)TCP 提供可靠的服务。也就是说,通过 TCP 连接传送的数据,无差错,不丢失,
- 不重复,且按序到达;UDP 尽最大努力交付,即不保证可靠交付。 并且因为 tcp 可靠,
- 面向连接,不会丢失数据因此适合大数据量的交换。
- (3)TCP 是面向字节流,UDP 面向报文,并且网络出现拥塞不会使得发送速率降低
- (因此会出现丢包,对实时的应用比如 IP 电话和视频会议等)。
- (4)TCP 只能是 1 对 1 的,UDP 支持 1 对 1,1 对多。
- (5)TCP 的首部较大为 20 字节,而 UDP 只有 8 字节。
- (6)TCP 是面向连接的可靠性传输,而 UDP 是不可靠的。
WebSocket
- 是浏览器与服务器进行全双工通信的技术
- 任何一方可以通过建立连接将数据发送给另一方
- 连接一旦建立,就可以一直保持这个状态