作为Java web开发工程师,平时项目中经常会使用到http请求。一般情况下我们最常用的就是get和post方法了,一般需要后台Java调用接口的时候,我个人喜欢用post方法。
那么问题来了,你要问我get和post有什么具体的区别呢?大体上我还是能答得上来几条不同点的,但是系统全面的区别我可能就给不出了。所以今天来系统地整理下HTTP中get和post的区别。
Http定义了与服务器交互的不同方法,最基本的方法有4种,分别是GET,POST,PUT,DELETE。URL全称是资源描述符,我们可以这样认为:一个URL地址,它用于描述一个网络上的资源,而HTTP中的GET,POST,PUT,DELETE就对应着对这个资源的查,改,增,删4个操作。GET一般用于获取/查询资源信息,而POST一般用于更新资源信息。
原理性
1. 根据HTTP规范,GET用于信息获取,而且应该是安全的和幂等的
- 所谓安全,意味着该操作用于获取信息而非修改信息。换句话说,
GET请求一般不应产生副作用。就是说,它仅仅是获取资源信息,就像数据库查询一样,不会修改,增加数据,不会影响资源的状态。注意这里的安全仅仅指不会修改资源。 - 幂等的意味着对同一URL的多个请求应该返回同样的结果。
2. 根据HTTP规范,POST表示可能修改变服务器上的资源的请求
上面大概说了一下HTTP规范中GET和POST的一些原理性的问题。但在实际的做的时候,很多人却没有按照HTTP规范去做,导致这个问题的原因有很多:
- 很多人贪方便,更新资源时用了
GET,因为用POST必须要到FORM(表单),这样会麻烦一点 - 对资源的增,删,改,查操作,其实都可以通过
GET/POST完成,不需要用到PUT和DELETE - 另外一个是,早期的
Web MVC框架设计者们并没有有意识地将URL当作抽象的资源来看待和设计,所以导致一个比较严重的问题是传统的Web MVC框架基本上都只支持GET和POST两种HTTP方法,而不支持PUT和DELETE方法。RESTFUL也是近几年才火起来的概念。
表面现象
说完原理性的问题,我们再从表面现像上面看看GET和POST的区别
1. 数据的位置不同
GET请求的数据会附在URL之后(就是把数据放置在HTTP协议头中),以?分割URL和传输数据,参数之间以&相连POST把提交的数据则放置在是HTTP包的包体中
2. GET方式提交的数据有长度限制,而POST提交的数据理论上没有长度限制
- 注意,这里没有具体指出长度限制是多少多少
KB。 - 因为实际上
HTTP协议并没有明确规定GET和POST分别能携带多少数据。限制数据量大小的是浏览器和服务器。 - 浏览器限制了
URL的长度,所以GET的数据+URL自身的长度不能超过浏览器的限制 POST携带的数据多少主要是受服务器处理数据量大小的限制
3. POST的安全性要比GET的安全性高
- 这里所说的安全性和上面
GET提到的“安全”不是同个概念。 - 上面“安全”的含义仅仅是不作数据修改,而这里安全的含义是真正的
Security的含义 - 比如:通过
GET提交数据,用户名和密码将明文出现在URL上,因为(1)登录页面有可能被浏览器缓存,(2)其他人查看浏览器的历史纪录,那么别人就可以拿到你的账号和密码了 - 除此之外,使用
GET提交数据还可能会造成Cross-site request forgery攻击
总结
Get是向服务器发索取数据的一种请求,而Post是向服务器提交数据的一种请求,在FORM(表单)中,Method默认为GET,实质上,GET和POST只是发送机制不同,并不是一个取一个发!