解释之前我们先基于Http协议,根据Http的请求方法对应的数据传输能力把Http请求分为Url类请求和Body类请求,Url类请求包括但不限于GET、HEAD、OPTIONS、TRACE 等请求方法。Body类请求包括但不限于POST、PUSH、PATCH、DELETE 等请求方法。
在语义上来说,例如GET请求是查询或者获取服务端的资源的,POST请求是向服务器push数据或者创建资源的。其它同类请求方法多少都有点相同的含义,不过它们谁有谁该做的事,例如支持缓存,探测响应头和断点续传等。
Url类请求释义
对于Url类请求,客户端是不能通过body写出数据的,服务端拿到的body是空的。因此一般情况下,我们提供的HttpClient被Url类的请求getOutputStream()的时候会抛一个异常,而HttpServer接受到Url类的请求后getInputStream()的时候也会抛一个异常,这都是为了告诉调用者这是不合理的。
这里的HttpClient和HttpServer不是特指某框架或者浏览器,而是个笼统的称呼。
因此Url类的请求想要提交参数,就把参数跟在url后边了,但是url一般是指向资源的,因此url后面跟的参数更多的是一种条件和要求(例如阿里云OSS处理图片时)。
看完图应该知道了,其实我们称为参数的这一段整体上叫做Query,把它们拆开后组成键值对的形式又叫做Parameters,大多数情况下一个Key对应一个Value,当然是允许一个Key对应多个Values的。
Body类请求释义
- GET在浏览器回退时是无害的,而POST会再次提交请求。
- GET产生的URL地址可以被Bookmark,而POST不可以。
- GET请求会被浏览器主动cache,而POST不会,除非手动设置
- GET请求的参数会完整的被保存在历史记录里,POST不会。
- GET请求参数放在URL中,POST放在request body中。
- GET请求只能进行url编码,POST请求支持多种编码方式。
- 对于参数类型,GET只接受ASCII字符,而POST没有限制。
- GET请求在URL中传递的参数是有长度限制的(理论上就是url的长度),而POST没有。