导语
get和post的区别是面试中经常会被问到的问题。
那么同样作为http请求,他们之间究竟有什么异同呢?
相同点
从本质上讲,get和post都是http请求,都是tcp连接,是无区别的。
不同点
关于参数
考虑参数的位置:get请求的参数位于url中,而post请求的参数位于request body中。
这导致了三个问题,
一是get请求的安全性不如post请求;
二是get的参数有长度限制,而post没有;
三是get的参数只允许ASCII字符,post没有限制。
关于回退
点击回退或刷新时,post请求会再次提交表单,而get请求不会。
所以post是回退有害的,get回退无害。
关于缓存
get能被缓存,可以收藏为书签,参数保留在浏览器历史中;
post不能被缓存,不可收藏为书签,参数不会保留在浏览器历史中。
关于请求包
get请求只发送一个tcp数据包,即http header和data共同发送给web服务器,服务器响应200 OK.
post请求发送两个tcp数据包,第一次发送http header,如果web服务器予以响应100 continue,则发送第二个数据包data,服务器响应200 OK.
对比总结
get | post | |
---|---|---|
参数位置 | url中 | request body |
参数长度 | 有限制 | 无限制 |
参数编码 | ASCII编码 | 无限制 |
后退/刷新 | 不重复提交,回退无害 | 重复提交,回退有害 |
安全性 | 参数暴露,不安全 | 安全 |
缓存 | 可以缓存 | 不可以缓存 |
书签 | 可以收藏为书签 | 不可收藏为书签 |
历史 | 参数保留在浏览器历史 | 不保留在浏览器历史 |
请求包个数 | 1个 http header+data | 两个 先http header,再data |