最全的Http协议get和post请求的整理

Posted 光荣之路

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了最全的Http协议get和post请求的整理相关的知识,希望对你有一定的参考价值。

文 | 孙千丽

不知道大家是怎么理解并记住状态码的,小编有个朋友是这么记的:

1**  我听着呢,继续啊!

2**  啦啦啦,完美收到!

3**  请移步那~~~里!

4**  你说错了吧,问我啥?没懂!

5**  @#¥%……&*,我想我应该是生病了。。。。

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得跑两趟,第一趟,先去和服务器打个招呼“嗨,我等下要送一东西来,你们打开门迎接我”,然后再回头把东西送过去。

1. GET与POST都有自己的语义,不能随便混用。
2. 据研究,在网络环境好的情况下,发一次包的时间和发两次包的时间差别基本可以无视。而在网络环境差的情况下,两次包的TCP在验证数据包完整性上,有非常大的优点。
3. 并不是所有浏览器都会在POST中发送两次包,Firefox就只发送一次。


无论上课或自学,

你首先需要准备:

每天 2 小时+的学习时间

每天坚持写代码的习惯!

有投入才有产出,

10k+的涨幅需要 1 年以上的努力!

祝你成功!


光荣之路出品







以上是关于最全的Http协议get和post请求的整理的主要内容,如果未能解决你的问题,请参考以下文章

整理了Http协议get和post请求应该是全网最全了,收藏起来慢慢看

整理了Http协议get和post请求应该是全网最全了,收藏起来慢慢看

一个linux下简单的纯C++实现Http请求类(GET,POST,上传,下载)

HTTP协议-GET/POST请求

整理POST请求方式

HttpClient使用详解与实战一:普通的GET和POST请求