从原理性看:
- 根据 HTTP 规范,GET 请求用于获取信息,而且应该是安全和幂等的,而 POST 请求表示可能修改服务器上资源
从表面上看:
- GET 请求的数据会附在 URL 后面(浏览器地址栏、Req Header 上),POST 的数据放在 HTTP 包体(Req Body 上)
- POST 安全性比 GET 安全性高,因为参数直接暴露在 URL 上,所以不能用来传递敏感信息。
这里的安全性是有待思考的,可以在 Is either GET or POST more secure than the other? 查看讨论结果。
下面是一些具体的区别。
GET 请求:
- GET 请求可以被缓存
- GET 请求保留在浏览器历史记录中
- GET 请求可以添加书签
- 处理敏感数据时,绝不应使用 GET 请求
- GET 请求有长度限制
- GET 请求应仅用于检索数据
- GET 产生一个 TCP 数据包
- GET 请求仅支持进行 URL 编码
- GET 参数通过 URL 传递
POST 请求:
- POST 请求永远不会被缓存
- POST 请求不会保留在浏览器历史记录中
- 不能为 POST 请求添加书签
- POST 请求对数据长度没有限制
- POST 产生两个 TCP 数据包
- POST 支持多种编码方式
- POST 放在请求体(Request body)中
需要注意的是,GET 请求提交的数据大小长度并没有限制,HTTP 协议规范没有对 URL 长度进行限制。这里的 GET 长度有限制,是指特定的浏览器及服务器对它的限制。
不同的浏览器长度限制可以查阅 What is the maximum length of a URL in different browsers?。服务器的话可以查阅 Is there a practical HTTP Header length limit?。