最全Http协议、get和post请求整理(2)
文 | 孙千丽
6、POST请求方法的特点
根据 HTTP 规范,POST 表示可能修改变服务器上的资源的请求。例如我们在刷微博的时候对某篇文章进行点赞,就是提交的POST 请求,因为它改变了服务器中的数据(该篇文章的点赞数)。
POST 方法因为有可能修改服务器上的资源,所以它是不符合安全和幂等性的。
从前面关于 POST 的请求报文也可以看出,POST 是将请求信息放置在请求数据中的,这也是POST 和 GET 的一点不那么重要的区别。因为 POST 方法的请求信息是放置在请求数据中的,所以它的请求信息是没有长度限制的。POST 方法会产生两个TCP 数据包,浏览器会先将请求头发送给服务器,待服务器响应100 continue,浏览器再发送请求数据,服务器响应200 ok(返回数据)。这么看起来 GET 请求的传输会比 POST 快上一些(因为GET 方法只发送一个 TCP 数据包),但是实际上在网络良好的情况下它们的传输速度基本相同。
7、HTTP工作原理
HTTP协议定义Web客户端如何从Web服务器请求Web页面,以及服务器如何把Web页面传送给客户端。HTTP协议采用了请求/响应模型。客户端向服务器发送一个请求报文,请求报文包含请求的方法、URL、协议版本、请求头部和请求数据。服务器以一个状态行作为响应,响应的内容包括协议的版本、成功或者错误代码、服务器信息、响应头部和响应数据。
8、HTTP的状态码含义
①大致可分为五大类
②常见的状态码
500 (服务器内部错误)服务器遇到错误,无法完成请求。
505 (HTTP 版本不受支持) 服务器不支持请求中所用的 HTTP 协议版本。
9、GET和POST请求的区别
说了那么多 GET 方法和 POST 方法各自的特点,它们在外在的表现上似乎是有着众多的不同,但是实际上,它们的本质是一样的,并无区别!这似乎有些不可思议,但是我们重新回想一下GET 和 POST 是什么?它们是 HTTP 请求协议的请求方法,而 HTTP 又是基于TCP/IP的关于数据如何在万维网中如何通信的协议,所以 GET/POST 实际上都是TCP 链接。
也就是说,GET 和 POST 所做的事其实是一样的,如果你给GET 加上请求数据,给 POST 加上 URL 参数,这在技术上是完全可行的,事实上确实有一些人为了贪图方便在更新资源时用了GET,因为用POST必须要到FORM(表单),但是一般不建议大家这样做。
其实可以想象一下,如果我们直接使用 TCP 进行数据的传输,那么无论是单纯获取资源的请求还是修改服务器资源的请求在外观上看起来都是TCP 链接,这样就非常不利于进行管理。所以在 HTTP 协议中,就会对这些不同的请求设置不同的类别进行管理,例如单纯获取资源的请求就规定为GET、修改服务器资源的请求就规定为 POST,并且也对它们的请求报文的格式做出了相应的要求(例如请求参数GET 位于 URL 而 POST 则位于请求数据中)。
对于 GET 和 POST 的区别,总的来说就是:它们的本质都是TCP 链接,并无区别。但是由于 HTTP 的规定以及浏览器/服务器的限制,导致它们在应用过程中可能会有所不同。
我们看看GET和POST的区别:
Get |
Post |
|
外观上 |
||
提交数据大小 |
提交少量数据,不同的浏览器最大值不一样,IE是255个字符 |
提交大量数据,可以通过更改php,ini配置文件提交数据的最大值 |
安全性 |
低 |
高 |
提交原理 |
提交的数据和数据之间是独立的 |
将提交的数据变成XML格式提交 |
灵活性 |
很灵活,只要有页面的跳转就可以get传递数据 |
不灵活 |
TCP数据包 |
产生一个TCP数据包 |
产生两个TCP数据包 |
长度限制 |
对长度有限制 |
对数据长度没有要求 |
收藏书签 |
可以被收藏为书签 |
不能被收藏为书签 |
回退 |
在浏览器回退时是无害的 |
会再次提交请求 |
请求缓存 |
可被缓存 |
不被缓存 |
获取数据 |
一般用去请求获取数据 |
一般作为发送数据到后台时使用 |
Bookmark |
不可以 |
|
编码 |
请求只能进行url编码 |
支持多种编码方式 |
参数数据类型 |
只接受ASCII字符 |
没有限制 |
请求设置 |
请求会被浏览器主动cache |
不会,除非手动设置 |
请求数据是否保留 |
保留在浏览器历史记录中 |
不会保留在浏览器历史记录中 |
请求方式 |
最常见是通过form表单发送数据请求 |
|
请求数据 |
是从指定资源请求数据,请求参数在URL中 |
向指定资源提交要被处理的数据,请求参数封装在HTTP请求数据中 |
参数传递 |
参数通过URL传递 |
POST放在Request body中 |
10、GET和POST请求的误区
针对上面常见的区别,如果面试的时候这么说,肯定是有很大的毛病,但是现在想想刚参加工作的时候也这样说过,现在回过头再想以前的错误认知,又有许多新的认识。
误区一:“用处:get常用于取回数据,post用于提交数据”
有这样一种说法:get替换post来优化网站性能,虽然这种说法没错,也的确get常被用于取回数据,但是post也被一些ui框架使用于取回数据,比如kendo ui中的grid,就是用post来接受数据的。所以结论是get、post用途也是因地制宜。如果你有使用过kendo UI,会发现分页、过滤、自定义的参数都包含在form data里面。
get是querystring(仅支持url编码),post是放在body(支持多种编码)
query参数是URL的一部分,而GET、POST等是请求方法的一种,不管是哪种请求方法,都必须有URL,而URL的query是可选的,可有可无。
误区二“请求参数长度限制:get请求长度最有限制,post对请求数据没有限制”
看起来这句话是没有错的,其实GET方法提交的url参数数据大小没有限制,在http协议中没有对url长度进行限制(不仅仅是querystring的长度),这个限制是特定的浏览器及服务器对他的限制。所以为了符合所有标准,url的最好不好超过最低标准的2083个字符(2k+35)。当然在做客户端程序时,url并不展示给用户,只是个程序调用,这时长度只收web服务器的影响了。对于中文的传递,一个汉字最终编码后的字符长度是9个字符。
最常见的form表单,浏览器默认的form表单,默认的content-typeapplication/x-www-form-urlencoded,提交的数据会按照key value的方式,jquery的ajax默认的也是这种content-type。当然在post方式中添加querystring一定是可以接收的到,但是在get方式中加body参数就不一定能成功接收到了。
误区三:“post比get安全性要高”
这里的安全是相对性,并不是真正意义上的安全,通过get提交的数据都将显示到url上,页面会被浏览器缓存,其他人查看历史记录会看到提交的数据,而post不会。另外get提交数据还可能会造成CSRF攻击。
误区四:“GET产生一个TCP数据包;POST产生两个TCP数据包。”
这一点理解起来还是有一定难度的,实际上,不论哪一种浏览器,在发送 POST 的时候都没有带Expect 头,server 也自然不会发 100continue。通过抓包发现,尽管会分两次,body 就是紧随在header 后面发送的,根本不存在『等待服务器响应』这一说。
从另一个角度说,TCP 是传输层协议。别人问你应用层协议里的 GET 和POST 有啥区别,GET和POST还有一个重大区别,简单的说:GET产生一个TCP数据包;POST产生两个TCP数据包。长的说:对于GET方式的请求,浏览器会把http header和data一并发送出去,服务器响应200(返回数据);而对于POST,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据)。
也就是说,GET只需要跑一趟就送到了,而POST得跑两趟,第一趟,先去和服务器打个招呼“嗨,我等下要送一东西来,你们打开门迎接我”,然后再回头把东西送过去。
3. 并不是所有浏览器都会在POST中发送两次包,Firefox就只发送一次。
提取码:k5fv
无论上课或自学,
你首先需要准备:
每天 2 小时+的学习时间,
每天坚持写代码的习惯!
有投入才有产出,
10k+的涨幅需要 1 年以上的努力!
祝你成功!
光荣之路出品