前言
在谈到GET和POST之间有什么区别的时候,我们首先应该具体了解一下GET和POST两种方法各自有什么特点。前面两部分先分别谈谈GET和POST方法,最后我们在总结这两种方法的区别。
一、GET方法
GET 是最常用的 HTTP 方法 . 常用于获取服务器上的某个资源。
1. 我们先谈谈在哪些情况下会构造出 HTTP GET 请求呢?
1.直接在浏览器中输入URL
2.HTML中的link,img,a,script等标签也能够触发HTTP GET请求
3.form表单
4.ajax
5.通过第三方工具,如postman这类工具
6.通过linux下的 wget/curl
7. ......
2. GET请求的特点:
1. 首行的第一部分为GET
2.URL的query string(查询字符串) 可以为空,也可以不为空。
3.header 部分有若干个键值对结构
4.body部分为空(绝大部分),其实也可以不为空。其实通过抓包,会发现其他网站的body基本都为空。
3. URL的长度有限制?这种说法是错的。
可以看到网上有很多帖子都说URL的长度存在上限,这种讲法是错的,在RFC 2616标准中并没有限制URL的长度。只是提到了服务器应该谨慎 URI 长度超过 255 字节,因为一些较旧的
客户端或代理实现可能无法正确支持这些长度。
RFC 2616标准文档:RFC 2616: Hypertext Transfer Protocol -- HTTP/1.1
https://www.rfc-editor.org/rfc/rfc2616
二、POST方法
1. 在哪些情况下会构造出 HTTP POST 请求呢?
1.form表单
2.ajax
3.通过第三方工具
4. ......
2. POST请求的特点:
1.首行的第一部分为POST
2.URL的query string 一般为空,但是也完全可以加上。(习惯用法)
3.header 部分有若干个键值对结构
4.body部分为空(绝大部分),其实也可以不为空。
3. body的长度,由请求头中的 Content-Length 字段来表示;body格式由Content-Type字段来表示
POST请求的body 里面的数据格式,可以支持很多格式。格式的类型由请求头中的Content-Type字段来表示。body的长度,由请求头中的 Content-Length 字段来表示。
三、GET和POST有什么区别?
GET和POST(以及HTTP协议的其他方法之间)之间没有本质区别!!!
但是细节上有细微区别:
1.数据位置:GET习惯把自定义数据放到 query string 中,POST习惯把自定义数据放到 body中
2.语义区别:GET一般用于获取数据,POST一般用于提交数据
3.幂等性:GET请求一般会设计成“幂等”的,POST请求一般不要求设计成幂等的
所谓的幂等,其实是数学上的一种术语,某个请求执行一次和执行多次没有什么区别,如果能做到这一点就称为幂等。比如说转账操作,同一次转账,不管提交几次,始终只会成功一次。因为同一次转账就会被分配一个身份标识,如果服务器对同一次转账收到多次请求,那么就会自动进行去重。因为GET方法一般习惯于是获取数据,所以一般会设计成幂等的
4.可缓存:GET请求一般会被缓存;POST请求一般不能缓存
所谓缓存,也是计算机圈子里面的一个术语,比如,在一般情况下进行一些复杂的计算,得到一些结果。如果这个结果的结算过程代价太大,就可以把这样的结果保存下来,下次直接使用,这样就避免重复计算了。 但是这种也不是绝对的,比如说像搜索广告这种业务场景,虽然也是GET请求,但是计算结果绝对不能缓存,因为搜索广告这种业务是要实时计算的。
四、打假一些关于GET和POST区别的说法!
1.POST比GET更安全 错!
这样的说法是不科学的. 是否安全取决于前端在传输密码等敏感信息时是否进行加密, 和 GET POST 无关。无论GET是把数据放到query string 还是POST把数据放到body,其实都是不安全。
2.GET传输的数据量小,POST传输的数据量大 错!
这个也是不科学的, 标准没有规定 GET 的 URL 的长度, 也没有规定 POST 的 body 的长度. 传输数据量多少, 完全取决于不同浏览器和不同服务器之间的实现区别。
3.GET只能传输文本数据,POST可以传输二进制数据 错!
这个也是不科学的. GET 的 query string 虽然无法直接传输二进制数据, 但是可以针对二进制数据进行 url encode。
五、HTTP都有哪些常见的方法?以及哪些地方可以带上自定义数据?
常见的方法
PUT 与 POST 相似,只是具有幂等特性,一般用于更新
DELETE 删除服务器指定资源
OPTIONS 返回服务器所支持的请求方法
HEAD 类似于 GET ,只不过响应体不返回,只返回响应头
TRACE 回显服务器端收到的请求,测试的时候会用到这个
CONNECT 预留,暂无使用
可以带上自定义数据的地方:
a) URL path
b) URL query string
c) header(可以添加自定义的键值对)
d) body