作为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
只是发送机制不同,并不是一个取一个发!