我理解的HTTP中的GET与POST是怎么样子的
今天的面试中,面试官问到一个问题是:你是怎么理解GET和POST这两个HTTP请求的?
这个我真没深究中他们中区别,一下子有点懵了…
我想了想就回答:GET是请求获取数据,POST是提交数据;GET没有POST安全,会把请求的东西暴露在URL上。
然后面试官蛋定的问:还有吗?
“没有了,我理解的就这么多了。。。”
“。。。”
经过个这轮尴尬的面试,回来后迫不及待的把GET与POST深挖出来:
首先什么是HTTP?
超文本传输协议(HTTP)的设计目的是保证客户机与服器之间的通信。就是浏览器与服务器之间的请求-应答的协议。
也是说:你访问网页时浏览器向服务器交HTTP请求;服务器再把你浏览器请求的内容返回来给你,在浏览器上显示。
在HTTP中,最基本的方法有4种,分别是GET、POST、PUT、DELETE。对应的就是查、改、增、删 4个操作。常用就是GET:用于获取/查询数据;POST:一般用于更新数据。
GET方法
查询的值在URL中发送的:
1 | /test/demo_form.asp?name1=value1&name2=value2 |
可以从URL看到,GET请求的值是以?分割URL和传输数据,参数之间以&相连。
如果值是英文字母/数字,原样发送;如果是空格,转换为+,如果是中文/其他字符,则直接把字符串用BASE64加密,得出如:%E4%BD%A0%E5%A5%BD,其中%XX中的XX为该符号以16进制表示的ASCII。
- GET请求可被缓存
- GET请求保留在浏览器历史记录中
- GET请求可被收藏为书签
- GET请求不应在处理敏感数据时使用
- GET请求有长度限制(最多只能是1024字节)
- GET请求只应当用于取回数据
因为GET只是获取数据,也就相当于查数据。对数据库是不会有影响的,不会修改和增加数据。也就是幂等的,(幂等:我理解是经过多次运算什么的,最后的值还是跟第一次的值相等)。
POST方法
查询的值是在POST请求的HTTP消息主体中发送的:
1 | POST /test/demo_form.asp HTTP/1.1 |
POST是没有大小限制的,HTTP协议规范也没有进行大小限制。
- POST请求不会被缓存
- POST请求不会保留在浏览器历史记录中
- POST不能被收藏为书签
- POST请求对数据长度没有要求
总结
POST的安全性要比GET的安全性高。
比如:通过GET提交数据,用户名和密码将出现在URL上;
- 登录页面有可能被浏览器缓存
- 其他人查看浏览器的历史纪录,那么别人就可以拿到你的账号和密码了
- 除此之外,使用GET提交数据还可能会造成Cross-site request forgery攻击
GET是向服务器发送获取数据是一种请求
POST是向服务器提交数据的一种请求
在FORM中,Method默认为“GET”,实质上,GET和POST只是发送机制不同,并不是一个取一个发!
参考资料