摘要:get和post,我们在平时项目中经常用到,有时我们会被问到get和post有什么区别,一开始被问到的时候会挺懵逼的,除了字面理解之外,好像也不是很了解到底是什么区别?下面我来说说我对get和post的区别的理解~
以前我师兄问过我这么一个问题
- Q : get和post有什么区别?
- A :一个是用于取数据,一个是用于修改数据
- Q : 还有吗?
- A : 好像就这么多。。
然而我的回答他好像不是很满意,那时候确实是我对get和post的理解还不够,之后做了整理,才发现原来这才是答案~
HTTP与服务器交互的方法有4种:get、post、put、delete,这4种方法其实就对应了对资源的查、改、增、删这4个操作。不过平时我们用的话都是用get和post方法,用这两个方法就能完成所有的操作啦。
那get和post到底有什么区别呢?这个问题很多同学在面试的时候都会被问到,也是一个十分经典的问题,这里我来说说我自己对get和post的区别的看法~
1.原理区别
get是用于获取数据
这里的获取数据对应我们前面说到的对资源的查找操作,这个操作是安全而且幂等的,这里的安全是指这里是用于获取信息而不是修改信息,不会产生其他影响,而幂等则表现为对同个URL的多个请求都返回同样的结果。
post表示可能修改服务器资源
HTTP包结构
这里我们先来看一下HTTP包结构
HTTP请求:
1 | <request line> // 请求行:请求类型、要访问的资源以及HTTP版本 <headers> // 请求头:说明服务器要使用的附加信息 <blank line> // 空行 <request-body> //请求体:任意其他数据 |
HTTP响应:
1 | <status line> //状态行:状态码表示响应状态 <headers> // 响应头:服务器返回请求头中需要的信息 <blank line> // 空行 <response-body> // 响应体:请求返回的数据 |
常见的状态码:
- 200(OK):找到资源,正常返回
- 301(Move Permanently):该资源被永久的改变了位置,通常会发送header来重定向到新的位置
- 302(Found):该资源被临时改变了位置,通常会发送header来临时重定向到新的位置
- 304(Not Modified):该资源上次请求之后没有任何修改,使用上次缓存的资源,用于浏览器缓存机制
- 404(NOT FOUND):在指定位置没找到该资源
- 500(Internal Server Error):服务器程序码出错
看完了HTTP包结构之后,我们再来看看get和post的其他区别
2.参数位置
get请求的数据附在URL之后,即HTTP协议头,以?分割url和传送数据,用&连接多个参数,数据如果是英文或者数字,则原样发送,空格转换为+,其他则转换为base64编码
post请求把数据则在HTTP请求包体中,以键值对的形式传送
3.缓存机制
get请求能够被缓存,请求会保存到浏览器的浏览记录中
post并不能被缓存
4.传输数据长度
get没有长度限制,因为HTTP请求没有限制URL长度,但是浏览器有限制URL长度,例如IE限制的长度为2k(2048字节)
post请求数据长度浏览器这边没有限制,但是服务器那边会对提交数据大小进行限制
5.安全性
get请求数据使用base64编码,显示在URL中可能造成CSRF攻击
post数据存放在request-body中,相对来说比较安全