Skip to content

http核心知识

什么是http?

HTTP 是基于 TCP/IP 的应用层协议,用于客户端(浏览器)和服务器之间传输超文本(HTML、JSON 等),默认端口 80,HTTPS 默认 443。

http 核心

特征

  • 无状态:服务器不记住客户端身份,每次请求独立(解决:Cookie/Session/Token)
  • 无连接:HTTP1.0 默认一次请求对应一次 TCP 连接,请求完断开(HTTP1.1 支持长连接 keep-alive)
  • 明文传输:数据不加密,抓包可看(安全风险:HTTPS=HTTP+TLS 加密传输)
  • 灵活可扩展:支持自定义请求头 / 响应头、多种数据格式(JSON/Form/ 二进制)

通信模型

  1. 客户端向服务器发送请求(request)
  2. 服务器接收请求,做出响应(response)
  3. 客服端接收响应,渲染页面/处理数据

提示

必须客户端先发起,服务器不能主动给客户端发数据(想主动用 WebSocket)

报文结构

HTTP 传输的核心是「报文」,本质是格式化的文本,分请求报文和响应报文,结构固定,抓包(F12-Network)能直接看到

请求报文

共 4 部分,顺序固定:请求行 → 请求头 → 空行 → 请求体

text
// 示例(GET请求,无请求体)
GET /api/user HTTP/1.1  // 请求行
Host: www.xxx.com       // 请求头
User-Agent: Chrome/120  // 请求头
Accept: application/json // 请求头 

                        // 空行(必须有,分隔头和体)
// POST请求(有请求体)
POST /api/login HTTP/1.1
Host: www.xxx.com
Content-Type: application/json
Content-Length: 32

{"username":"test","password":"123456"} // 请求体
  • 请求行:3 个核心要素 请求方法 + 请求路径 + HTTP版本
  • 请求头:键值对,描述请求的附加信息(如目标地址、数据格式、浏览器信息)
  • 空行:必须存在,告诉服务器「请求头结束了」
  • 请求体:仅 POST/PUT 等方法有,存放要传给服务器的核心数据(JSON / 表单 / 文件)

响应报文

同样 4 部分,顺序固定:状态行 → 响应头 → 空行 → 响应体

text
// 示例
HTTP/1.1 200 OK         // 状态行
Server: Nginx           // 响应头
Content-Type: application/json
Content-Length: 28

{"code":200,"msg":"success","data":{}} // 响应体
  • 状态行:3 个核心要素 HTTP版本 + 状态码 + 状态描述
  • 响应头:键值对,描述服务器信息、响应数据格式、缓存规则等
  • 空行:同上,分隔响应头和响应体
  • 响应体:服务器返回的核心数据(前端要渲染 / 处理的内容)

请求方法和状态码

请求方法

语义化,告诉服务器要做什么。如GET就是查询,POST就是创建,PUT就是更新,DELETE就是删除。

方法是否有请求体常用场景幂等性
GET无(拼接参数)查询数据
POST有(请求体)新增数据,隐私度高的数据查询
PUT有(请求体)修改数据
DELETE删除数据
PATCH有(请求体)修改数据
HEAD获取数据信息
OPTIONS获取支持的请求方法
TRACE测试请求
CONNECT代理请求

幂等性:指对同一资源进行多次操作时,结果一致。如 GET 请求,多次请求结果一致。 (比如 GET 查 10 次,结果一样;POST 提交 10 次,可能创建 10 条数据,非幂等)

状态码

3 位数字,首位分类,前端根据状态码做不同处理(如 200 成功、401 未登录、500 服务器错)

状态码分类首位含义常用
请求1**请求中100 Continue(请求继续) 、101 Switching Protocols(切换协议)
成功2**操作成功200 OK(成功)、201 Created(创建成功)
重定向3**重定向301 永久重定向(域名变更)、302 临时重定向、304 协商缓存命中(性能优化)
客户端错误4**客户端错误400 Bad Request(参数错误)、401 Unauthorized(未登录 / 令牌过期)、403 Forbidden(无权限)、404 Not Found(路径不存在)、405 Method Not Allowed(请求方法不支持)
服务器错误5**服务器错误500 Internal Server Error(服务器未知错)、502 Bad Gateway(网关错)、503 Service Unavailable(服务器忙)

HTTP 版本演进

HTTP 不是一成不变的,核心演进方向是「提升性能、减少延迟」。

版本特征优点缺点前端感知
0.9纯文本简单、兼容性好无状态
1.0短连接、无长连接实现简单频繁建立 / 断开 TCP,性能差早期 Web,现在基本不用
1.1支持长连接(keep-alive)、支持管道化请求、支持缓存控制减少 TCP 连接开销,提升性能队头阻塞(一个请求慢,后面请求都等)目前最常用,日常开发默认
2.0二进制帧传输、多路复用、服务器推送、头部压缩解决队头阻塞,性能大幅提升依赖 HTTPS,部分老浏览器不支持加载更快,接口并发无阻塞,主流项目已适配
3.0基于 QUIC 协议(UDP)、彻底解决队头阻塞延迟更低、更稳定(弱网友好)普及度低前端感知更友好,开发更简单

HTTP 缓存

强缓存

优先级高,不用询问服务器 原理:本地有缓存,且未过期,直接用本地缓存,不发请求给服务器 请求头(响应头):Cache-Control(主流)、Expires(老旧) 常用值:Cache-Control: max-age=3600(缓存 1 小时)、no-cache(不强制缓存,走协商缓存)、no-store(不缓存)

协商缓存

原理:强缓存过期后,客户端带缓存标识问服务器「缓存还能用吗」,服务器判断后返回 304(能用,用本地缓存)或 200(不能用,返回新资源)

缓存标识(请求头 + 响应头配对):

  • ETag / If-None-Match(优先,基于资源内容生成唯一标识)
  • Last-Modified / If-Modified-Since(基于资源最后修改时间)

跨域与预检请求

跨域

什么是跨域?

同源:域名、端口、协议一致,否则为跨域(如 http://localhost:8080 访问 https://localhost:3000 跨域)

跨域解决方案

配置 CORS(跨域资源共享,HTTP 层面解决)

http
Access-Control-Allow-Origin: * // 允许所有源访问
Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS // 允许的请求方法
Access-Control-Allow-Headers: Content-Type, Authorization// 允许的请求头

常用请求头/响应头

请求头

  • host:访问的域名
  • Content-Type: 请求体格式
    • application/json json格式
    • application/x-www-form-urlencoded 表单格式
    • multipart/form-data 文件上传
  • Authorization: 身份令牌
  • Accept:客户端能接收的响应数据格式(如 application/json)

响应头

  • Access-Control-Allow-Origin:允许的源
  • Access-Control-Allow-Methods:允许的请求方法
  • Access-Control-Allow-Headers:允许的请求头
  • Content-Type:响应数据格式
  • Set-Cookie:设置 Cookie
  • Cache-Control:缓存控制

HTTP 和 HTTPS 的对比

核心:HTTPS = HTTP + TLS 加密层,数据传输加密,HTTP 明文传输 安全:HTTPS防抓包篡改、防窃听、防冒充(有证书验证) 端口:HTTP→80,HTTPS→443 前端感知:地址栏有小锁标识,跨域时部分场景要求 HTTPS(如 Service Worker)

这是我的个人文档