大家好,我是爱玩的程序员狼王。你肯定会遇到或者被问到HTTP相关的知识。今天,我们就来说说HTTP的请求方式以及它们的区别吧!写过接口或者用过web开发者模式的朋友一定对下面的内容不陌生没错,就是这些HTTP请求的方法。面试的时候被问到这个问题,我会以面试的形式呈现给大家,拉到面试现场吧!连续的脚步声,由远及近,会议室的门被推开了。我站起来看着面试官。发际线快到后脑勺了,黑框大眼镜也掩盖不了黑眼圈。不凡的程序员,穿着很不拘一格,上身是衬衫西装,下身是牛仔裤和拖鞋。心里默念:我真是老大,毋庸置疑!然后面试官让我坐下,面试正式拉开序幕!自我介绍等问题在此省略。1w字...面试官:在平时的开发过程中,你常用的HTTP请求方式有哪些?我:是这样的。HTTP/1.1协议定义了八种方法,有时也称为动作,用来表示对Request-URL指定的资源的不同操作方式。在HTTP1.0中,定义了三种请求方法:GET、POST和HEAD方法。在HTTP1.1中新增了五种请求方法:OPTIONS、PUT、DELETE、TRACE和CONNECT方法,但我们通常使用GET和POST请求。面试官:那么,GET和POST请求有什么区别?(果然,让我看看你有多重)我:(我假装被难住了,然后想了想说)这个。..我没有特别注意,但据我了解,大概有几个区别:GET请求的URL中传递的参数有长度限制,而POST没有。GET不如POST安全,因为参数直接暴露在URL上,因此它们不能用于传递敏感信息。而POST数据将不会显示在URL中。它被放置在请求正文中。对于参数的数据类型,GET只接受ASCII字符,而POST没有限制。GET请求参数将完整保留在浏览器历史记录中;反之,POST请求参数不会被浏览器保留。GET请求只能进行url编码(application/x-www-form-urlencoded),而POST支持多种编码方式。GET请求会被浏览器主动缓存,但是POST不会,除非手动设置。GET在浏览器回退时无害,而POST则重新提交请求。面试官心想:(我没关注过,原来你还有一个好东西,跟我一起放在这边,放在杯子里?看我怎么教育你。)面试官:Get请求有没有请求体?如果是这样,参数可以像Post请求一样放入吗?我:(呵呵,看来我有机会把我昨天精心准备的半个小时告诉他[手动挠头]滚开,我开始放大招了)其实,GET是没有的POST和POST本质??上的区别,两者都是HTTP协议中发送请求的两种方式。HTTP是一种基于TCP/IP的协议,用于数据在万维网上的通信方式。WorldWideWeb:简称WWW,是WorldWideWeb的缩写,又称Web、3W等。HTTP的底层是TCP/IP。所以GET和POST底层也是TCP/IP,也就是说GET/POST都是TCP连接。GET和POST可以做同样的事情。GET需要加一个requestbody,POST需要加一个url参数,技术上是完全可行的。举个栗子:(嗯?栗子?肚子饿了,面试完再买点。)TCP就像一辆车。我们使用TCP来传输数据。非常可靠,绝不会漏件、漏件。但是,如果路上到处都是看起来一模一样的汽车,世界就会变得一团糟。一辆传递紧急信息的汽车可能会被前面一辆满载货物的汽车挡住,整个交通系统肯定会瘫痪。为了防止这种情况发生,流量规则HTTP诞生了。HTTP为汽车运输设定了几个服务类别,包括GET、POST、PUT等。HTTP规定在执行GET请求时,汽车必须标记为GET(设置方法为GET),要求发送数据放在楼顶(在url中)方便记录。如果是POST请求,需要在车上贴上POST标签,将货物放入车中(在请求体中)。当然,你也可以在使用GET的时候偷偷在隔间里藏一些货,但这并不丢人;POST的时候也可以在车顶放一些数据,这样也会让人觉得傻。HTTP只是一种行为规范,而GET和POST本质??上都是TCP连接,没有区别。但是,由于HTTP法规和浏览器/服务器的限制,它们在应用过程中表现出一些差异。面试官心想:(呵呵,这小子还真懂这方面,看来我误会他了,我是不是遇到大佬了?)面试官:你说的对,那你刚才在url中传的参数是多少长度获取和发布的限制?我:其实在Web里面,还有一个很重要的角色:运输公司。不同的浏览器客户端(发起http请求)和服务器服务器(接受http请求)是不同的运输公司。虽然理论上可以在楼顶无限堆货(在url中添加无限参数)。但是运输公司并不傻。装卸也花费不少。他们会限制单次运输的数量来控制风险。过多的数据对浏览器和服务器都是很大的负担。业界不成文的规定是(大多数)浏览器通常将URL的长度限制为2K字节,而(大多数)服务器最多可以处理64K大小的URL。超出部分将不予处理。如果你使用GET服务,偷偷的把数据隐藏在请求体中,不同的服务器会有不同的处理方式。有的服务器会帮你卸载数据,读出数据,有的服务器则直接忽略。因此,GET虽然可以携带请求体,但并不能保证一定会被接收到。面试官:(看来理论真的掌握的很好,让我测试一下他的实际应用)GET方法的参数的写法是固定的吗?我:按照约定,我们的参数写在?后面,用&隔开。像下面这样:http://ip:port/test/getHelloWorld?username=langwang&age=26&sex=2我们知道解析报文的过程就是通过获取TCP数据,利用诸如此类的工具,从数据中得到Header和Body作为正则化。提取参数。比如在header请求头中加入token,用于验证用户是否登录等权限问题。换句话说,我们可以自己约定参数怎么写,只要服务端能解释清楚,一切照旧。面试官:那么POST方式是不是比GET方式更安全?我:有人说POST比GET更安全,因为地址栏上看不到数据。但是从传输的角度来看,它们都是不安全的,因为HTTP在网络上是明文传输的,只要在网络节点上抓包,就可以完整的获取到数据报文。其实想要安全传输,只有加密,也就是HTTPS。面试官:嗯,对对对,看来你对HTTP协议还是有一定了解的,那你知道Get请求和Post请求发送的数据包有什么区别吗?我:(貌似面试官一定要把我问才满意?可惜,可惜,看我的套路。)面试官,说实话,我之前的公司加班不少.我最近刚刚签约并辞职。贵公司是我面试的第一家公司,所以准备工作还不够,所以我大概说一下我的理解,有错的地方还请见谅。面试官:没关系,按照你的理解聊。(这小子还没准备好就这么说了,我好好想想,别错过机会,失去一个可以为公司加班的人才)我:嗯,是这样的,生成一个TCP包在GET请求期间;POST根据请求生成两个TCP数据包。GET:浏览器将http头和数据一起发送,服务器响应200(返回数据);POST:浏览器先发送header,服务器响应100continue,浏览器再次发送数据,服务器响应200OK(返回数据)。就好比GET送货只需要一辆车走一趟,而POST却要走两趟。第一次,先去服务器打个招呼,老哥,我待会发一批货,你准备好收货哈哈,然后回去发货。因为POST需要两步,理论上要多一点时间,而且GET好像比POST效率更高。但是并不是,后来发现是个坑。在我看来:GET和POST各有语义,不能随便混用。据研究,在网络环境好的情况下,发送一个数据包和发送两个数据包的时间差异基本可以忽略不计。在网络环境较差的情况下,有两个数据包的TCP在验证数据包的完整性方面有很大的优势。并非所有浏览器都在POST中发送数据包两次,Firefox只发送一次。去年用Chrome浏览器测试过,发现只发送了一次,所以觉得Get和POST性能不好可以人为忽略。面试官:嗯,你说的很好,请稍等。我:(是不是又出事了?这波操作是不是发现我在跟面试官做例行面试?应该不会吧)五分钟后,面试官端着酒走了进来。...采访者:你觉得这咖啡怎么样?(套路自古流行,学的很好)。我喝了一口,竖起大拇指说:面试官,这是正宗的卡布奇诺。我平时喜欢喝。可惜这么贵。.嗯?进来之前没看到你们这里有咖啡店,是这里吗?面试官嘴角上翘,微微一笑,露出两颗洁白的门牙说:我在你的简历上看到你很喜欢喝咖啡。很巧,我们公司有专门的水吧,福利之一就是每天一杯免费的咖啡或者饮料。以后可以经常喝。我:你什么意思,我被采访了?那太棒了!对了,水霸每天几点下班?跟开发一样吗?你一定要试试)面试官:哈哈,对,水吧总是准时关门。如果我们公司有人加班,可以去水吧喝喝。加班时间是免费的。如果你在这里没有问题,我想你可以在下周一入职。我:好的,面试官,我回去考虑一下,到时候联系你,再见!至此,本次关于HTTP请求方式以及GET和POST区别的访谈就结束了。谢谢观看!.今天就到这里吧,我会继续分享我的所学所想,希望我们一起走在成功的路上!
