HTTP技能使用说明
2026-03-29
新闻来源:网淘吧
围观:20
电脑广告
手机广告
重定向(常混淆概念)
- 307与308:两者均保留请求方法;307为临时重定向,308为永久重定向——适用于POST/PUT请求的重定向场景
- 301/302可能将POST转为GET(浏览器行为)——带请求体的API重定向切勿使用
- 必须包含
Location响应头且需使用绝对URL——旧版本客户端可能无法解析相对路径 - 重定向循环:限制在5-10次跳转内;无限循环将导致客户端崩溃
缓存策略组合
Cache-Control: no-store适用于敏感数据——绝不写入磁盘no-cache仍会缓存但每次都需要重新验证——并非"不缓存"private, max-age=0, must-revalidate适用于用户专属、需实时更新的内容public, max-age=31536000, immutable适用于带版本号的静态资源Vary: Accept-Encoding, Authorization当响应内容依赖这些请求头时——遗漏Vary声明将导致缓存异常
条件请求
ETag+If-None-Match:推荐用于API——基于内容哈希- 强ETag与弱ETag:
"abc"对比W/"abc"——弱ETag允许语义上等价的响应 If-Match用于乐观锁:如果资源自读取后已更改,则更新失败- 当
If-Match失败时返回412 Precondition Failed——而非409 Conflict
CORS预检请求触发条件
- 自定义头部(任何非Accept、Accept-Language、Content-Language、Content-Type简单值的头部)
- Content-Type非以下类型:application/x-www-form-urlencoded、multipart/form-data、text/plain
- PUT、DELETE、PATCH方法——即使目标同源,若满足其他条件也会触发
- ReadableStream请求体——会触发预检
- 预检结果缓存时长由
Access-Control-Max-Age控制—设置为86400以减少OPTIONS请求泛滥
安全响应头(必须设置)
Strict-Transport-Security: max-age=31536000; includeSubDomains—HSTS一经设置便不易撤销X-Content-Type-Options: nosniff—防止MIME嗅探攻击X-Frame-Options: DENY或SAMEORIGIN—防止点击劫持内容安全策略—配置复杂但至关重要;建议先启用仅报告模式
范围请求
Accept-Ranges: bytes表示支持范围请求——客户端可请求部分内容Range: bytes=0-1023请求前1024字节;bytes=-500请求最后500字节- 返回206部分内容状态码并携带
Content-Range: bytes 0-1023/5000 - 如果范围无效,返回416 Range Not Satisfiable——包含
Content-Range: bytes */5000
错误响应最佳实践
- 结构化的JSON错误:
{"error": {"code": "VALIDATION_FAILED", "message": "...", "details": [...]}} - 在错误响应中包含请求ID——便于日志关联
- 生产环境中不要泄露堆栈跟踪——在服务器端记录,返回通用消息
- 业务规则违规(重复邮箱、资金不足)时使用409 Conflict——不仅仅是400
重试模式
- 默认只重试幂等方法——GET、PUT、DELETE、HEAD
- POST重试需要幂等键——
Idempotency-Key: <客户端生成的uuid> - 指数退避:1秒、2秒、4秒、8秒……加入抖动——防止惊群效应
- 遵循
Retry-After响应头——可以是秒数或HTTP日期 - 设置合理的超时时间(通常为30秒)——不要无限等待
常被遗忘的请求头
Vary必须包含影响响应的头部——不设置CORSVary: Origin会破坏Content-Disposition: attachment; filename="report.pdf"用于下载X-Request-ID:若不存在则生成,并向下游服务传递Accept-Language用于本地化响应——需遵循并设置优雅降级机制
连接行为
- HTTP/1.1协议下若未设置
Content-Length或分块传输,则响应后关闭连接 Transfer-Encoding: chunked用于流式传输——此时不可设置Content-Length- HTTP/2为二进制多路复用协议——HTTP层面无队头阻塞
- WebSocket升级:需使用GET请求并设置
Connection: Upgrade与Upgrade: websocket
文章底部电脑广告
手机广告位-内容正文底部


微信扫一扫,打赏作者吧~