HTTP 使用指南 | 青训营笔记

116 阅读4分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 8 天

HTTP 简介

Hyper Text Transfer Protocol 超文本传输协议

应用层协议 基于 TCP 协议

请求 - 响应

简单可扩展

无状态

  • HTTP/0.9 单行协议 响应仅支持HTML文档 仅支持GET请求方式
  • HTTP/1.0 构建可扩展性 增加Header 增加状态码 支持多种文件类型
  • HTTP/1.1 标准化协议 支持缓存 允许链接复用 内容协商
  • HTTP/2 更进一步 二进制协议压缩 header 允许服务器推送
  • HTTP/3 草案 ongoing

HTTP 结构

请求方法

  • GET 获取资源
  • POST 提交资源
  • PUT 更新资源
  • DELETE 删除资源
  • HEAD
  • CONNECT
  • OPTIONS
  • TRACE
  • PATCH

safe 不会修改服务器数据的方法 GET HEAD OPTIONS

idempotent 同样请求被执行一次与执行多次效果一致且服务器状态一样 GET HEAD OPTIONS PUT DELETE

状态码

  • 1xx 指示信息,请求已接收
  • 2xx 成功,请求已被成功接收
  • 3xx 重定向,完成请求需进一步操作
  • 4xx 客户端错误,请求有语法错误或请求无法实现
  • 5xx 服务器端错误,服务器无法实现合法的请求

  • 200 OK
  • 301 资源被永久转移至新地址
  • 302 临时跳转
  • 401 请求未经授权
  • 404 请求资源不存在
  • 500 服务器内部错误
  • 504 网关或代理服务器无法获得需要的响应

RESTful API

Representational State Transfer

  • GET 获取资源

  • POST 新建资源

  • PUT 更新资源

  • DELETE 移除资源

  • URL 代表一种资源

  • 客户端和服务端之间传递资源的表现层

  • 客户端通过 HTTP 方法,对服务端资源进行操作,实现状态层转化

请求头

  • Accept 接收类型,表示浏览器支持的MIME类型
  • Content-Type 客户端发送的实体内容类型
  • Cache-Control 指定请求和缓存遵循的缓存机制
  • If-Modified-Since 用于匹配查看文件是否存在变动
  • Expires 缓存控制,控制使用缓存而非直接请求的时间范围
  • Max-Age 资源在本地的缓存时间长度
  • If-None-Match 匹配文件是否改变
  • Cookie 存在 cookie 且同域时会自动带上
  • Referer 页面来源 URL,精确到详细页面地址
  • Origin 请求源,精确到端口
  • User-Agent 用户客户端必要信息

响应头

  • Content-Type
  • Cache-Control
  • Last-Modified
  • Expires
  • Max-age
  • ETag 资源特定版本标识符
  • Set-Cookie 设置cookie
  • Server 服务器一些相关信息
  • Access-Control-Allow-Origin 服 务器允许请求Origin头部

缓存

强缓存

  • expires 时间戳

  • cache-control 可缓存性

    • 可缓存性

      • no-cache 协商缓存验证
      • no-store 不使用缓存
    • 到期

      • max-age 存储最大周期
    • 重新验证&重新加载

      • must-revalidate 强制更新缓存,缓存过期后未验证或更新前无法使用

协商缓存

  • Etag | If-none-match 资源特定版本
  • Last-modified | If-modified-since 最后修改时间

Cookie

  • name=value cookie的名称和值
  • expries=date cookie有效期
  • path=path 限制cookie发送范围的文件目录
  • domain=domain 限制cookie生效域名
  • secure 仅HTTPS连接可发送cookie
  • HttpOnly 阻止js脚本读取cookie
  • samesite=[ ... ] none同站跨站均可,strict同站可

HTTP 发展

HTTP/2

    • HTTP/2 通信的最小单位
    • 每个帧包括帧头,至少包括当前帧所属数据流
    • 是二进制
  • 消息

    • 与逻辑请求或响应对应的完整的一系列帧
  • 数据流

    • 已建立的连接内的双向数据流,可以承载一条或多条消息
    • 允许数据交错发送
  • 其他

    • HTTP/2 连接是永久的,且单个来源只需一个连接
    • 流控制 - 阻止发送方向接收方发送大量数据
    • 允许服务器推送

HTTPS

经过 TSL/SSL 加密

  • 对称加密 加密解密使用同一个密钥
  • 非对称加密 加密解密使用两个不同的密钥 - 公钥&私钥

HTTP 场景分析

场景案例 - 静态资源

CDN content delivery network

缓存 + CDN + 文件名hash

场景案例 - 登录

不同域名提供登录API

HTTP 默认80端口

HTTPS 默认443端口

Session+cookie

JWT JSON web token

场景案例 - 跨域

  • CORS

  • 代理服务器
  • Iframe

场景案例 - 用户体验

  • 网络优化

    • 开启http/2
    • 数据压缩
    • 域名 - 域名收敛及域名发散
    • 预解析 <link rel="dns-prefetch" href="#"></link>
    • 预连接 <link rel="preconnect" href="#"></link>
  • 稳定性

    • 重试机制(超时、错误)
    • 缓存
    • 数据安全(HTTPS、劫持)

HTTP 实战

浏览器 - XMLHttpRequest

  • 0 UNSENT 代理创建
  • 1 OPENED 调用open方法
  • 2 HEADERS_RECEIVED 调用send方法
  • 3 LOADING 下载中
  • 4 DONE 下载完成

浏览器 - fetch

  • promise化
  • 模块化设计

Node - http | https

  • node环境默认模块

浏览器&Node - axios

  • 请求库
  • 支持浏览器环境和nodejs环境

其他

websocket

浏览器和服务器进行全双工通讯

URL以ws或wss开头

QUIC

Quick UDP Internet Connection