您的位置 首页 php

程序员:面试官又问我post和get的区别了

今天,我们扯点别的哈。

学院派? 码农 :PHP

我看到很多从事前端工作的头条作者们,在他们发表一段视频代码后,被很多人说“前端算程序员吗?”我就想说,你玻璃心吗?

每一个程序员应该都听说过程序员鄙视链,做c的看不起做 c++ 的,做c++看不起做 java 的,做java看不起做.net的,这些所有都看不起搞前端的。

之所以这样,就因为我们入门低,早期的前端被称为美工,切图仔,反正除了切页面就是切页面,写写简单的html、css、顶多十几行的js,再拿到后端手中,不出一会他们就渲染好了,对他们来说,我们的切页面他们渲染,他们干的活是最低级,我们干的活已经是最高级的了。

这话一出,就有人开始闹事了,就会有下面一段话:

码农:不服是吧,那问问你。

程序员:就是不服,问啊

码农:你知道post和get区别吗?

程序员:知道啊,就。。。

码农:看看下面这篇文章吧,问了好多人,就没有说的全乎的,理解的相当浅。

前言

这个问题几乎是我们程序界经常谈论的一个话题,我刚出道的找工作的时候不知道有多少个面试官问了,我也总是说不全,终于下定决心好好整理一篇了,送给你们,让你们也装一把大佬,想一直当下去,还是要靠学习的啊。

看看我今天面试的有点web前端开发基础的小哥回答的。回答完后脸上充满自信,小腿往前一伸,碰到我了哈。这就是我们面试官耳熟能详的区别。

  1. get比post更不安全,因为参数直接暴露在URl中,所以不能用来传递敏感的信息。
  2. 对参数的数据类型,get只接受ASCLL字符,而post没有限制
  3. get在URl中传递的参数是有长度限制的,而post没有
  4. get请求会被浏览器主动cache,而post不会除非手动设置
  5. get在浏览器回退时无请求的,而post会再次请求
  6. get参数通过URl传递,post放在request body中
  7. get请求只能进行url编码,而post支持多种编码方式
  8. get比post更快

是不是你们也觉得还不错啊,回答够清晰了是不,确实,那小伙一点没有停顿,摁着手指头一条一条说了出来。

但,不是我想要的!

再瞅瞅W3C上的总结

常见误区

误区1、get在URl中传递的参数是有长度限制的,而post没有

首先,HTTP协议并未规定get和post的长度限制,get的最大长度限制是因为浏览器和web服务限制了URL的长度,不同的浏览器和 web服务器 ,限制的最大长度不一样。

即使get有长度限制,也是限制整个URL的长度,而不仅仅是参数值数据长度,就要看各个浏览器厂家的规定或者根据web服务器的处理能力来决定的。

以下就是对各种浏览器和web服务器的最大处理能力做一些说明:

  • IE (Browser):URL最大长度限制为2083个字符。
  • Firefox owser):对于Firefox浏览器URL的长度限制为65,536个字符。
  • afari (Browser):URL最大长度限制为 80,000个字符。
  • Opera (Browser):URL最大长度限制为190,000个字符。
  • oogle (chrome):URL最大长度限制为8182个字符。
  • che (Server):能接受最大url长度为8,192个字符。
  • Microsoft Internet Information Server(IIS):能接受最大url的长度为16,384个字符。

为了符合所有标准,url的最好不好超过最低标准的2083个字符(2k+35)。当然在做客户端程序时,url并不展示给用户,只是个程序调用,这时长度只收web服务器的影响了。对于中文的传递,一个汉字最终编码后的字符长度是9个字符。

最常见的form表单,浏览器默认的form表单,默认的content-type是application/x-www-form-urlencoded,提交的数据会按照key value的方式,jquery的ajax默认的也是这种content-type。当然在post方式中添加querystring一定是可以接收的到,但是在get方式中加body参数就不一定能成功接收到了。

误区2、post比get更安全

这里的安全是相对性,并不是真正意义上的安全,通过get提交的数据都将显示到url上,页面会被浏览器缓存,其他人查看历史记录会看到提交的数据,而post不会。另外get提交数据还可能会造成Cross-site request forgery攻击。

误区3、为什么get比post快

post请求包含更多的请求头,(如content-type),但这影响不了多少, 最重要的是post在真正接受接受数据之前会先将请求头发送给服务器进行确认,然后才是真正的发送数据。

看看post的请求过程:

  • 浏览器请求 TCP 连接(第一次握手)
  • 服务器答应进行tcp连接(第二次握手)
  • 浏览器确认,并发送post请求头(第三次握手,这个 报文 比较小,所以http会在此时进行第一次数据发送)
  • 服务器返回100 Continue响应
  • 浏览器发送数据
  • 服务器返回200 OK响应

get的请求过程:

  • 浏览器请求tcp连接(第一次握手)
  • 服务器答应进行tcp连接(第二次握手)
  • 浏览器确认,并发送get请求头和数据(第三次握手,这个报文比较小,所以http会在此时进行第一次数据发送)
  • 服务器返回200 OK响应

误区4、GET产生一个TCP数据包;POST产生两个TCP数据包。

我在网上查了查,千万不要被某些内容引导你。

这个结论是错误的。

而实际上,不论哪一种浏览器,在发送 POST 的时候都没有带 Expect 头,server 也自然不会发 100 continue。通过抓包发现,尽管会分两次,body 就是紧随在 header 后面发送的,根本不存在『等待服务器响应』这一说。

注: 误区4观点参考网上大神结论。

误区5、get和post都符合安全性和 幂等

幂等性 :就是对数据库的操作次数,一次或者多次操作获得的结果是一样的,则认为符合幂等性。

安全性 :对数据库的操作没有改变数据库中的数据,则认为符合安全性。

从数据库层面来看,GET请求方式是做查询操作,因此不会改变数据库中原有的数据,认为符合安全性。事实上GET请求可能会出现多次请求的结果(例如在两次请求中间对数据库中的数据作了更改),从这来说是不符合幂等性的定义,但是因为GET请求知识查询数据库,不会对数据库做任何更改,因此也认为是幂等的。

POST请求方式是既不幂等又不安全,首先POST请求方式往数据库中提交数据的,因此会改变数据库中的数据。其次,POST请求方式每次获得的结果都有可能不一样,因为POST请求是作用在上一级的URL上的,则每一次请求都会添加一份新资源(这也是POST和 PUT 方式的最大区别,PUT方式是幂等的)。

赶紧学,我们不希望下次见到你还是那些老套的区别,我们只想简单的知道你到底对get和post有没有去深入的了解。

通过上面的文章希望大家更深的了解get和post的区别。

文章来源:智云一二三科技

文章标题:程序员:面试官又问我post和get的区别了

文章地址:https://www.zhihuclub.com/78584.shtml

关于作者: 智云科技

热门文章

网站地图