
中等初级DevOps后端
GET 和 POST HTTP 请求方法的主要区别是什么?
简短答案
GET 请求数据(只读),默认是安全、幂等且可缓存的,参数通过 URL 传递。POST 在请求体中发送数据供服务器处理,默认既不安全、也不幂等、不可缓存。
目的
- GET 请求资源的表示形式。按照规范,它是只读的:客户端不期待任何服务器状态变化。RFC 9110 指出,在 GET 请求中发送请求体具有未定义语义,因此 GET 不应携带请求体。
- POST 请求目标资源按照其自身语义处理请求体中包含的数据(创建记录、提交表单、上传文件等)。
数据放在哪里
- GET 将参数放在 URL 查询字符串中(在
?之后,格式为key=value&...)。这些参数会显示在地址栏中,并记录在浏览器历史和服务器日志里,而且受实际 URL 长度限制。 - POST 将数据放在请求体中;其类型由
Content-Type标头给出。HTML 表单通常使用application/x-www-form-urlencoded(默认)或multipart/form-data(用于文件)。协议层面没有固定的大小限制,但服务器和代理会配置各自的最大值(例如 Nginxclient_max_body_size)。
RFC 9110 下的属性
- 安全:GET 是安全的(只读);POST 不是。
- 幂等:如果执行 N 次请求对服务器状态的影响与执行 1 次相同,则该请求是幂等的。GET 是幂等的;POST 不是——重复提交可能会创建重复项,例如两份相同的订单。幂等不等于安全(PUT 和 DELETE 是幂等的,但不安全),它也不意味着响应体必须相同。
- 可缓存:GET 响应默认可缓存;POST 响应只有在包含显式的新鲜度信息以及匹配的
Content-Location标头时才可缓存,而这在实践中很少见。
实际影响
- 将 GET 用于检索和导航;结果可以安全重复、加入书签并预取,刷新 GET 页面也无害。
- 将 POST 用于改变状态的操作,以及发送敏感或较大的负载。刷新或返回到 POST 页面时,浏览器会触发“确认表单重新提交”警告。
- 绝不要通过 GET 发送密码——它们会出现在 URL、日志和历史记录中。这是卫生问题,不是加密:HTTPS 会对传输中的 URL 和请求体都进行加密,但 URL 仍会被记录。
常见后续问题
- 安全方法是 GET、HEAD、OPTIONS;幂等方法是 GET、HEAD、PUT、DELETE;POST 既不是安全的也不是幂等的。
- HTML 表单支持这两种方法(
method属性)。 - RFC 意义上的“安全”表示不改变状态,而不是数据保护。
- 应用层面的 POST 幂等性通常通过幂等键来实现。
