HTTP核心:协议、状态码与请求方法详解

0 阅读4分钟

一、HTTP 是什么?

  • 定义:超文本传输协议(HyperText Transfer Protocol),应用层协议,基于 TCP(默认端口 80;HTTPS 为 443 + TLS 加密)。

  • 核心特点

    • 无状态:每次请求独立,服务器不保留上下文(通过 Cookie/Session 模拟状态)。
    • 请求-响应模型:客户端发起请求 → 服务器返回响应。
    • 明文传输(HTTP):敏感数据需用 HTTPS(HTTP + SSL/TLS)。
    • 版本演进:HTTP/1.1(当前最广泛)、HTTP/2(多路复用、头部压缩)、HTTP/3(基于 QUIC)。初学建议先吃透 HTTP/1.1。
  • 为什么重要:所有 Web 通信(API、网页、文件上传等)的底层规则,后端需精准处理请求/响应。


二、常见 HTTP 状态码(按类别精要)

类别状态码含义后端使用场景
2xx 成功200 OK请求成功普通查询返回
201 Created资源创建成功POST 创建资源后返回,含 Location
204 No Content成功但无响应体DELETE 操作后常用
3xx 重定向301 Moved Permanently永久重定向域名迁移
302 Found临时重定向登录后跳转(注意:POST 重定向可能转为 GET)
304 Not Modified缓存有效(配合 If-Modified-Since优化性能,减少传输
307/308临时/永久重定向(保持原请求方法比 302/301 更符合 REST 语义
4xx 客户端错误400 Bad Request请求语法错误参数校验失败
401 Unauthorized未认证(需登录)返回 WWW-Authenticate
403 Forbidden无权限访问权限校验失败
404 Not Found资源不存在路径错误或资源删除
405 Method Not Allowed方法不支持如对只读接口发 POST
429 Too Many Requests请求过频限流场景
5xx 服务器错误500 Internal Server Error服务器内部错误代码异常(需日志排查)
502 Bad Gateway网关错误(上游服务异常)Nginx 代理后端挂掉
503 Service Unavailable服务暂不可用维护中或过载
504 Gateway Timeout网关超时后端服务响应慢

💡 提示:RESTful API 设计中,状态码是语义的重要组成部分(如创建用 201,删除用 204)。


三、常见 HTTP 头字段(Header)

类型字段作用示例/注意
请求头HostHTTP/1.1 必需,指定目标域名(支持虚拟主机)Host: api.example.com
User-Agent客户端标识(浏览器/爬虫)用于兼容性处理
Accept客户端可接受的响应类型Accept: application/json
Content-Type请求体格式(POST/PUT 关键)application/json, multipart/form-data
Authorization认证凭证(Bearer Token / Basic)Bearer xxx
Cookie客户端携带的会话标识Set-Cookie 设置
Referer请求来源页面防盗链、统计
响应头Content-Type响应体格式text/html; charset=utf-8
Set-Cookie服务器设置客户端 CookieHttpOnly, Secure 等属性
Location重定向目标地址(配合 3xx)Location: /new-path
Cache-Control缓存策略max-age=3600, no-cache
WWW-Authenticate401 时要求认证方式Basic realm="Access"
通用头Date消息生成时间服务器自动添加
Connection连接管理(HTTP/1.1 默认 keep-alive

🔒 安全提示:敏感头(如 Authorization)务必通过 HTTPS 传输;Set-Cookie 建议加 Secure(仅 HTTPS)、HttpOnly(防 XSS)。


四、GET vs POST:本质区别与常见误区

维度GETPOST
语义(RFC 核心)安全 + 幂等:仅获取资源,不修改服务器状态非安全 + 非幂等:提交数据,可能创建/修改资源
参数位置URL 查询字符串(?id=1请求体(Body),格式由 Content-Type 决定
缓存/书签可缓存、可收藏为书签默认不缓存(需显式设置),不可直接书签
浏览器行为回退无提示回退时提示“重新提交表单”
数据类型仅 ASCII(需 URL 编码)支持二进制(如文件上传)
长度限制受浏览器/服务器 URL 长度限制(非协议规定)无协议限制(但服务器可配置 body 大小)
幂等性✅ 多次请求效果相同❌ 多次提交可能产生副作用(如重复下单)

⚠️ 澄清常见误区:

  1. “POST 比 GET 安全”错误!

    • 安全性取决于是否用 HTTPS。GET 参数在 URL 中易泄露(历史记录、日志),故敏感数据(密码、token)绝不放 URL,但 POST Body 同样可被截获。
    • HTTP 术语中“安全”指“不改变服务器状态”,GET 是安全方法,POST 不是。
  2. “GET 不能有 Body"不严谨

    • HTTP/1.1 未禁止 GET 带 Body,但语义上强烈不推荐,且多数服务器/代理会忽略或报错。
  3. “POST 一定发两个 TCP 包”谣言

    • 数据包数量取决于实现、网络状况,与方法无关(HTTP/1.1 可 Pipeline,HTTP/2 多路复用)。

✅ 后端实践建议:

  • 遵循语义:查询用 GET,创建用 POST,更新用 PUT/PATCH,删除用 DELETE(RESTful)。

  • 防误用:绝不使用 GET 执行修改操作(如 ?action=delete&id=1),易被 CSRF 攻击或爬虫触发。

  • 参数设计

    • GET:用于过滤、分页(/users?role=admin&page=2
    • POST:提交表单、上传文件、发送 JSON(Content-Type: application/json