5月27日 01:11

GET 和 POST 的区别是什么?何时使用 POST?

从 HTTP 协议本身看,GET 和 POST 只有两个本质区别:

  1. 语义不同:GET 是"获取"(安全、幂等),POST 是"提交数据以处理"(不幂等)
  2. POST 有 body,GET 没有(GET 也可以有 body,但 RFC 不推荐,很多实现不支持)

其他所谓的区别——"GET 参数在 URL 里,POST 在 body 里"、"GET 参数长度有限制"、"GET 被浏览器缓存"——要么是实现细节,要么是浏览器的行为,不是协议本身的约束。

何时用 POST:创建/修改资源、提交表单、需要传大量数据、需要隐藏敏感参数(虽然 body 也不安全,HTTPS 才是真正保护)。

追问

GET 请求真的不能有 body 吗?

RFC 7231 没有禁止,但建议不要给 GET 加 body。实际上 fetchXMLHttpRequest 都支持带 body 的 GET,但浏览器 <form><a> 不支持,很多中间件/代理也不处理 GET body。

PUT 和 POST 有什么区别?

都是提交数据,但语义不同:PUT 是幂等的(多次调用结果相同——替换指定位置的资源),POST 不是(多次调用可能创建多个资源)。PUT 的 URL 通常确定具体资源(/users/1),POST 是集合 URL(/users)。

POST 比 GET 更安全吗?

不安全。POST body 在 HTTP 下仍然是明文传输,只是 URL 里看不到而已。HTTPS 下二者都加密后才发送,POST 的"安全性"优势在 HTTPS 下不存在。真正的区别是 POST 数据不会出现在日志/浏览器历史/server log 的 URL 中。

标签:网络