HTTP中get和post的区别

作为Java web开发工程师,平时项目中经常会使用到http请求。一般情况下我们最常用的就是getpost方法了,一般需要后台Java调用接口的时候,我个人喜欢用post方法。

那么问题来了,你要问我getpost有什么具体的区别呢?大体上我还是能答得上来几条不同点的,但是系统全面的区别我可能就给不出了。所以今天来系统地整理下HTTPgetpost的区别。

Http定义了与服务器交互的不同方法,最基本的方法有4种,分别是GETPOSTPUTDELETEURL全称是资源描述符,我们可以这样认为:一个URL地址,它用于描述一个网络上的资源,而HTTP中的GETPOSTPUTDELETE就对应着对这个资源的查,改,增,删4个操作。GET一般用于获取/查询资源信息,而POST一般用于更新资源信息。

原理性

1. 根据HTTP规范,GET用于信息获取,而且应该是安全的和幂等的

  • 所谓安全,意味着该操作用于获取信息而非修改信息。换句话说,GET请求一般不应产生副作用。就是说,它仅仅是获取资源信息,就像数据库查询一样,不会修改,增加数据,不会影响资源的状态。注意这里的安全仅仅指不会修改资源。
  • 幂等的意味着对同一URL的多个请求应该返回同样的结果。

2. 根据HTTP规范,POST表示可能修改变服务器上的资源的请求

上面大概说了一下HTTP规范中GET和POST的一些原理性的问题。但在实际的做的时候,很多人却没有按照HTTP规范去做,导致这个问题的原因有很多:

  • 很多人贪方便,更新资源时用了GET,因为用POST必须要到FORM(表单),这样会麻烦一点
  • 对资源的增,删,改,查操作,其实都可以通过GET/POST完成,不需要用到PUTDELETE
  • 另外一个是,早期的Web MVC框架设计者们并没有有意识地将URL当作抽象的资源来看待和设计,所以导致一个比较严重的问题是传统的Web MVC框架基本上都只支持GETPOST两种HTTP方法,而不支持PUTDELETE方法。RESTFUL也是近几年才火起来的概念。

表面现象

说完原理性的问题,我们再从表面现像上面看看GET和POST的区别

1. 数据的位置不同

  • GET请求的数据会附在URL之后(就是把数据放置在HTTP协议头中),以?分割URL和传输数据,参数之间以&相连
  • POST把提交的数据则放置在是HTTP包的包体中

2. GET方式提交的数据有长度限制,而POST提交的数据理论上没有长度限制

  • 注意,这里没有具体指出长度限制是多少多少KB
  • 因为实际上HTTP协议并没有明确规定GETPOST分别能携带多少数据。限制数据量大小的是浏览器和服务器。
  • 浏览器限制了URL的长度,所以GET的数据+URL自身的长度不能超过浏览器的限制
  • POST携带的数据多少主要是受服务器处理数据量大小的限制

3. POST的安全性要比GET的安全性高

  • 这里所说的安全性和上面GET提到的“安全”不是同个概念。
  • 上面“安全”的含义仅仅是不作数据修改,而这里安全的含义是真正的Security的含义
  • 比如:通过GET提交数据,用户名和密码将明文出现在URL上,因为(1)登录页面有可能被浏览器缓存,(2)其他人查看浏览器的历史纪录,那么别人就可以拿到你的账号和密码了
  • 除此之外,使用GET提交数据还可能会造成Cross-site request forgery攻击

总结

Get是向服务器发索取数据的一种请求,而Post是向服务器提交数据的一种请求,在FORM(表单)中,Method默认为GET,实质上,GETPOST只是发送机制不同,并不是一个取一个发!

浅谈HTTP中Get与Post的区别