HTTP协议了解吗?常用状态码Get和Post的区别?

1 个回答

  • 王玄
    做自己,而不是解释自己。
    # HTTP 要点 * **无状态**、基于请求-响应;报文由 **起始行 + 头部 +(可选)消息体** 构成。 * 版本:1.1(持久连接、分块传输)、2(多路复用、首部压缩)、3(QUIC/UDP)。 * 常用方法:GET/POST/PUT/PATCH/DELETE/HEAD/OPTIONS。 * 缓存与条件请求:`Cache-Control`、`ETag/If-None-Match`、`Last-Modified/If-Modified-Since`。 # 常用状态码 * **2xx 成功** * `200 OK`:成功(可带响应体) * `201 Created`:已创建(常见于 POST 新资源) * `202 Accepted`:已接受异步处理 * `204 No Content`:成功但无实体(如 DELETE、PUT 成功不回包体) * `206 Partial Content`:分块/断点续传 * **3xx 重定向** * `301 Moved Permanently`:永久重定向(GET 可缓存) * `302 Found`:临时重定向(历史上常被改成 GET) * `303 See Other`:POST 后转 GET(PRG 模式) * `307/308`:严格保持原方法重定向(不把 POST 变 GET) * `304 Not Modified`:缓存命中(条件请求) * **4xx 客户端错误** * `400 Bad Request`:请求错误(参数/格式) * `401 Unauthorized`:未认证(配 `WWW-Authenticate`) * `403 Forbidden`:已认证但无权限 * `404 Not Found`:资源不存在 * `405 Method Not Allowed`:方法不被允许 * `408 Request Timeout`:客户端超时 * `409 Conflict`:资源状态冲突(幂等更新常用) * `413 Payload Too Large` / `414 URI Too Long` * `415 Unsupported Media Type` * `429 Too Many Requests`:限流 * **5xx 服务端错误** * `500 Internal Server Error` * `502 Bad Gateway` / `503 Service Unavailable` / `504 Gateway Timeout` * `511 Network Authentication Required` # GET vs POST(真正的区别与用法) | 点 | GET | POST | | ---- | --------------------------------------------- | ------------------------------------- | | 语义 | **获取**资源(只读,**安全**) | **提交**数据创建/处理(通常**非幂等**) | | 幂等性 | **幂等**(多次相同请求效果相同) | 通常**非幂等**(下单、转账) | | 缓存 | **可缓存**(默认可被缓存代理缓存;配 `Cache-Control/ETag` 最佳) | **默认不可缓存**,除非明确响应头允许 | | 参数位置 | 常放 **URL 查询串**(`?a=1&b=2`) | 常放 **消息体**(`application/json`/`form`) | | 长度限制 | 协议不限制,**浏览器/服务器/代理**通常限制 URL 长度 | 实际由服务器配置/反向代理限制请求体大小 | | 可见性 | URL 会进浏览器历史、书签、日志 | 请求体不进地址栏(但同样需 HTTPS 才安全) | | 典型用途 | 列表、详情、下载、条件 GET | 新建资源、表单提交、复杂查询(体内 JSON)、RPC | | 重定向 | 301/302 常被客户端改为 GET | **PRG 模式**:POST→`303`→GET,避免重复提交 | | CORS | GET 是“简单请求”之一 | `application/json` 等会触发 **预检**(非简单类型) | > 备注:HTTP 语义允许 **GET 带请求体**,但大多服务器/中间件**忽略或不支持**,不建议使用。 > 安全性方面:**GET 和 POST 都不加密**,是否安全取决于 **HTTPS**;只把敏感信息放 POST 并不能“自动安全”。 # 实战建议 * **读取**走 GET;**创建**走 POST;**幂等更新**用 PUT;**部分更新**用 PATCH;**删除**用 DELETE。 * 避免用 POST 做“查询”只是为了绕过缓存/长度限制——真要复杂查询,用 POST 但响应里自己做缓存键或后端缓存。 * 表单提交用 **POST→303→GET**(PRG),防止刷新重复提交。 * 给 GET 配好缓存策略(`Cache-Control`, `ETag`),能明显减压。 * 需要幂等的写操作,设计 **幂等键** 或使用 PUT/`If-Match`(配 ETag)做并发控制。
    发布于 2025-08-19 17:27 •IP属地 山西
    举报
    评论
    收藏