← 所有题目
GET 和 POST HTTP 请求方法的主要区别是什么?
中等初级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(用于文件)。协议层面没有固定的大小限制,但服务器和代理会配置各自的最大值(例如 Nginx client_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 幂等性通常通过幂等键来实现。
HTTP网络

立即下载,免费试用,解决你的任务!

下载 Windows 版
10 15 个免费积分 • 无需信用卡版本: 加载中…

免安装 - 下载即用。免注册 - 用 Google 登录。