Skip to content
 

HTTP 基础讲解

更新: 12/8/2025字数: 0 字 时长: 0 分钟

HTTP(HyperText Transfer Protocol)是现代互联网通信的基础协议。无论是浏览网页、调用 API 还是微服务交互,都离不开 HTTP 协议。本文将全面解析 HTTP 协议的各个关键组成部分,包括请求方法、报文结构、头部字段、状态码以及安全策略,帮助开发者深入理解并优化 Web 通信。

一、HTTP 基础概念

1.1 什么是 HTTP?

HTTP 是一种无状态请求-响应协议,基于 TCP/IP 实现,用于客户端(浏览器、App 等)和服务器之间的通信。

  • 无状态:每个请求相互独立,服务器默认不记录之前的交互(依赖 Cookie/Session 维持状态)
  • 明文传输(HTTPS 会对内容加密)
  • 默认端口:80(HTTP)、443(HTTPS)

二、HTTP 请求方法详解

HTTP 定义了一组请求方法(HTTP Methods)来表明对资源的操作意图:

方法说明是否幂等安全请求体
GET获取资源
POST提交数据
PUT替换资源
DELETE删除资源
PATCH部分更新资源
HEAD获取响应头
OPTIONS获取支持的通信选项

关键概念:

  • 幂等性:多次执行相同操作结果一致(如 GET 不会改变资源状态)
  • 安全性:不会修改资源的操作(如 GET、HEAD)

三、HTTP 报文结构

3.1 请求报文

http
POST /api/data HTTP/1.1
Host: example.com
Content-Type: application/json
Accept: application/json
Authorization: Bearer xxxxxx

{"name": "John"}
  • 请求行方法 + URL + HTTP版本
  • 请求头:包含元数据(如认证、内容类型等)
  • 空行:分隔头部和主体
  • 请求体:实际传输的数据

3.2 响应报文

http
HTTP/1.1 200 OK
Content-Type: application/json
Cache-Control: max-age=3600

{"status": "success"}
  • 状态行HTTP版本 + 状态码 + 状态文本
  • 响应头:服务器返回的元数据
  • 空行:分隔头部和主体
  • 响应体:返回的实际内容

四、HTTP 头部字段详解

HTTP 头部字段是 HTTP 协议的核心组成部分,它们控制着客户端与服务器之间的通信方式。本文将全面整理 HTTP 协议中所有重要的头部字段,包括请求头、响应头、安全头以及内容协商相关字段。

4.1 内容协商头部

4.1.1 Accept 相关字段

头部字段说明示例值重要参数
Accept声明客户端可接受的响应内容类型text/html, application/jsonq权重值(0-1)
Accept-Charset可接受的字符编码utf-8, iso-8859-1
Accept-Encoding可接受的内容编码(压缩方式)gzip, deflate, br
Accept-Language可接受的语言zh-CN, en-US;q=0.9
Accept-Patch服务器支持的 PATCH 格式application/json-patch+json

示例:

http
Accept: text/html, application/xhtml+xml, application/xml;q=0.9
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN, zh;q=0.9, en;q=0.8

4.1.2 Content-Type 相关字段

头部字段说明常见 MIME 类型
Content-Type实体主体的媒体类型text/html, application/json
Content-Encoding内容编码方式gzip, deflate
Content-Language内容语言zh-CN, en-US
Content-Location返回资源的替代位置/alternative.html

常见 Content-Type 值:

  • text/plain:纯文本
  • text/html:HTML 文档
  • application/json:JSON 数据
  • application/xml:XML 数据
  • multipart/form-data:文件上传
  • application/x-www-form-urlencoded:表单数据

4.2 请求控制头部

4.2.1 请求来源与目标

头部字段说明示例
Host请求的目标主机example.com
Origin请求来源(协议+域名+端口)https://example.com
Referer请求来源页面 URLhttps://example.com/page
User-Agent客户端标识Mozilla/5.0

4.2.2 缓存控制

头部字段说明示例
Cache-Control缓存指令no-cache, max-age=3600
If-Modified-Since条件请求(时间)Wed, 21 Oct 2023 07:28:00 GMT
If-None-Match条件请求(ETag)"123456"

4.2.3 连接管理

头部字段说明示例
Connection连接控制keep-alive, close
Upgrade协议升级websocket

4.3 响应控制头部

4.3.1 重定向与位置

头部字段说明示例
Location重定向目标 URL/new-location
Refresh自动刷新/重定向5; url=/new-page

4.3.2 响应缓存

头部字段说明示例
ETag资源版本标识"123456"
Last-Modified最后修改时间Wed, 21 Oct 2023 07:28:00 GMT
Expires过期时间Thu, 01 Dec 2023 16:00:00 GMT

4.3.3 CORS 相关

头部字段说明示例
Access-Control-Allow-Origin允许的源*, https://example.com
Access-Control-Allow-Methods允许的方法GET, POST, PUT
Access-Control-Allow-Headers允许的头部Content-Type, Authorization

4.4、安全相关头部

4.4.1 基础安全头

头部字段说明推荐值
Strict-Transport-Security强制 HTTPSmax-age=31536000; includeSubDomains
X-Content-Type-Options禁用 MIME 嗅探nosniff
X-Frame-Options防点击劫持DENY, SAMEORIGIN

4.4.2 内容安全策略(CSP)

http
Content-Security-Policy:
  default-src 'self';
  script-src 'self' 'unsafe-inline' cdn.example.com;
  img-src *;
  style-src 'self' 'unsafe-inline'

4.4.3 其他安全头

头部字段说明示例
X-XSS-ProtectionXSS 保护1; mode=block
Referrer-Policy控制 Referer 信息no-referrer-when-downgrade
Feature-Policy控制浏览器功能geolocation 'none'

4.5、特殊用途头部

4.5.1 下载控制

头部字段说明示例
Content-Disposition内容处置方式attachment; filename="file.txt"

4.5.2 分块传输

头部字段说明示例
Transfer-Encoding传输编码chunked

4.5.3 WebSocket

http
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==

4.6、最佳实践

4.6.1 API 设计推荐头

http
Accept: application/json
Content-Type: application/json
Cache-Control: no-cache
Authorization: Bearer xxxxxx

4.6.2 安全头配置示例

http
Strict-Transport-Security: max-age=31536000
Content-Security-Policy: default-src 'self'
X-Frame-Options: DENY
X-Content-Type-Options: nosniff

4.6.3 性能优化头

http
Cache-Control: public, max-age=3600
Content-Encoding: gzip
ETag: "123456"

五、HTTP 状态码详解

HTTP 状态码分为 5 大类,用于表示请求的处理结果。

5.1. 1xx(信息响应)

状态码含义说明
100Continue客户端应继续发送请求
101Switching Protocols服务器同意切换协议(如 WebSocket)

5.2. 2xx(成功响应)

状态码含义说明
200OK请求成功
201Created资源创建成功
204No Content无返回内容(如 DELETE 请求)

5.3. 3xx(重定向)

状态码含义说明
301Moved Permanently永久重定向
302Found临时重定向
304Not Modified资源未修改(缓存生效)

5.4. 4xx(客户端错误)

状态码含义说明
400Bad Request请求格式错误
401Unauthorized未认证
403Forbidden无权限
404Not Found资源不存在

5.5. 5xx(服务器错误)

状态码含义说明
500Internal Server Error服务器内部错误
502Bad Gateway网关错误
503Service Unavailable服务不可用

六、预检请求

浏览器会在以下情况发起预检请求(Preflight Request),即自动先发送一个 OPTIONS 请求,确认服务器允许实际请求后再发送正式请求:

触发预检的 3 种条件

  1. 非简单请求方法

    • 使用 PUTDELETECONNECT 等方法(GETPOSTHEAD 不会触发简单请求
  2. 自定义请求头

    • 包含非安全头部(如 AuthorizationX-Custom-Header 等)
  3. 特殊 Content-Type

    • Content-Type 不是以下三种之一:
      • text/plain
      • multipart/form-data
      • application/x-www-form-urlencoded
    • 例如:application/json 会触发预检

示例场景

javascript
// 会触发预检的请求
fetch("https://api.example.com", {
  method: "PUT", // 非简单方法
  headers: {
    "Content-Type": "application/json", // 非简单Content-Type
    "X-Token": "123" // 自定义头部
  }
});

不会触发预检的简单请求

javascript
// 简单请求(不触发预检)
fetch("https://api.example.com", {
  method: "POST",
  headers: {
    "Content-Type": "application/x-www-form-urlencoded" // 简单Content-Type
  }
});

我见青山多妩媚,料青山见我应如是。