post和get的区别
先说说自己的理解吧!
get请求:常用于查询,参数拼接在url后面,规范:?xx==xx&xxx=xxx,所以携带字符只能是ascll,大小限制只有2048字节,不安全,因为可以直接手动在地址栏输入,会被浏览器缓存(在项目中遇到场景,获取用户信息,从第三方地址跳回,disk chche(200)强缓存)
post请求:常用于提交数据,引发指定资源更新。携带字符格式,大小都没有要求,数据存于body中,安全,无缓存。
最佳答案:
语义区别:
- GET:获取资源,常用于读取或下载资源
- POST:用于将实体(body)提交到指定的资源,通常导致状态或服务器上的副作用的更改
应用场景的区别:
以下场景使用GET:
- 交互更像是一个问题(即,它是一个安全操作,例如查询,读取操作或查找)
- 请求中的URL可以被手动输入
- 请求中的URL可以被存在书签中,或者历史里,或者快速拨号里面,或者分享别人
- 请求中的URL是可以被搜索引擎收录的
- 带云压缩的浏览器,比如Opera mini/Turbo 2。只有GET才能在服务器端被预取的
- 请求中的URL可以被缓存
以下场景使用POST
- 交互更像是一个命令或者,交互以用户可以感知的方式改变资源的状态(例如:订阅服务),或者用户应对交互的结果负责
请求URL,请求头,请求体的区别
-
get
- URL的最大长度是2048字符,只允许ASCII字符
- W3C的标准GET不用body,RFC的标准GET可以携带body
-
post
- URL数据长度无限制
GET 与 POST 的本质区别有两点
-
请求行不同:
- GET:GET /uri HTTP/1.1
- POST:POST /uri HTTP/1.1
-
对服务器资源的操作不同:
- GET:表示从服务器获取资源
- POST:向指定的服务器资源提交数据(通常导致状态或服务器上的副作用的更改)
| 场景 | GET | POST |
|---|---|---|
| 后退按钮/刷新 | 无害 | 数据会被重新提交 |
| 书签 | 可收藏为书签 | 不可收藏为书签 |
| 缓存 | 能被缓存 | 不能缓存 |
| 编码类型 | application/x-www-form-urlencoded | application/x-www-form-urlencoded 或 multipart/form-data。 |
| 历史 | 参数保留在浏览器历史中 | 参数不会保存在浏览器历史中 |
| 对数据长度的限制 | URL 的最大长度是 2048 个字符 | 无限制 |
| 对数据类型的限制 | 只允许 ASCII 字符 | 没有限制。也允许二进制数据 |
| 安全性 | 安全性较差,因为所发送的数据是 URL 的一部分。 | 更安全,因为参数不会被保存在浏览器历史或 web 服务器日志中 |
| 可见性 | 数据在 URL 中对所有人都是可见的 | 更安全,因为参数不会被保存在浏览器历史或 web 服务器日志中 |
ps: RFC 中 100 Continue 并不是 POST Method 中的一个步骤,并且也不仅仅只能用于 POST method