5月27日 01:11
GET 和 POST 的区别是什么?何时使用 POST?
从 HTTP 协议本身看,GET 和 POST 只有两个本质区别:
- 语义不同:GET 是"获取"(安全、幂等),POST 是"提交数据以处理"(不幂等)
- POST 有 body,GET 没有(GET 也可以有 body,但 RFC 不推荐,很多实现不支持)
其他所谓的区别——"GET 参数在 URL 里,POST 在 body 里"、"GET 参数长度有限制"、"GET 被浏览器缓存"——要么是实现细节,要么是浏览器的行为,不是协议本身的约束。
何时用 POST:创建/修改资源、提交表单、需要传大量数据、需要隐藏敏感参数(虽然 body 也不安全,HTTPS 才是真正保护)。
追问
GET 请求真的不能有 body 吗?
RFC 7231 没有禁止,但建议不要给 GET 加 body。实际上 fetch 和 XMLHttpRequest 都支持带 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 中。