1. 概述
关于 get/post,可以查看 rfc-2616 了解详情:
get: RFC 2616 - Hypertext Transfer Protocol – HTTP/1.1
post: RFC 2616 - Hypertext Transfer Protocol – HTTP/1.1
其实,http 中的 get 与 post 只是单纯的名字上的区别,get 请求的数据也可以放在 request body 中,只是浏览器没有实现它。
get/post 可以顾名思义地理解,get 是用来请求数据,那么,既然是请求数据,为什么还要带上数据呢?其实很好理解,比如一个新闻页面,有很多内页,那么 get 请求可能带上的类似这样的参数 page=1,即为请求第一页的数据。post 的话顾名思义就是发送数据,所以需要带上数据
1. 区别
1. get是安全和幂等的
安全: 此处的安全是指不会影响到服务端内容。get请求从服务端获取程序,并不会修改服务端内容。
幂等: 不管同一个get请求发送多少次,服务端最终的状态都是相同的,此为幂等。
2. post 相对 get 请求是 “安全” 的
“安全”: 此处的安全是指get请求使用明文加在URL后面,所有人可见,而post请求是将请求数据封装在请求体中。
既然是安全,为何加双引号呢?是因为抓个包就能看到post请求,所以这个安全有点伪安全。
3. get 请求发送数据更小
虽然http对URL长度并没有限制,但是浏览器和操作系统会限制URL长度,既然get请求数据是放在URL上,那就也要受到URL长度限制。
4. get 能被缓存,post 不能被缓存
这点非常容易理解,打开一个页面,如果之前打开过,那么很明显速度会加快,这是因为 html/js/css/img 等文件都能被浏览器缓存(也可以被服务器缓存),而这些文件的获取,都是用的 get 请求。事实上,web 中的绝大多数请求都是用 get 完成的,post 请求目前为止我只是在 ajax 以及 form 表单中有见过。
但是实际上,http 协议中 post 和 get 都是可以被缓存的,不过不要惊讶,浏览器的实现总是比标准厉害。(post 和 get 真的只有名字上的区别啊。。)
3. 表面现像上面看看GET和POST的区别:
GET后退按钮/刷新无害,POST数据会被重新提交(浏览器应该告知用户数据会被重新提交)。
GET书签可收藏,POST为书签不可收藏。GET能被缓存,POST不能缓存 。
GET编码类型application/x-www-form-url,POST编码类型encodedapplication/x-www-form-urlencoded 或 multipart/form-data。为二进制数据使用多重编码。
GET历史参数保留在浏览器历史中。POST参数不会保存在浏览器历史中。
GET对数据长度有限制,当发送数据时,GET 方法向 URL 添加数据;URL 的长度是受限制的(URL 的最大长度是 2048 个字符)。POST无限制。
GET只允许 ASCII 字符。POST没有限制。也允许二进制数据。
与 POST 相比,GET 的安全性较差,因为所发送的数据是 URL 的一部分。GET的数据在 URL 中对所有人都是可见的。POST的数据不会显示在 URL 中。