最全的Http协议、get和post请求的整理
1、什么是GET 和 POST ?
GET 和 POST 其实都是 HTTP 的请求方法。除了这 2 个请求方法之外,HTTP 还有 HEAD、PUT、DELETE、TRACE、CONNECT、OPTIONS 这 6 个请求方法。所以HTTP的请求方法共计有 8 种,每个请求方法和描述如下:
l GET 请求指定的页面信息,并返回实体主体。
l POST 向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的建立和/或已有资源的修改。
l HEAD 类似于get请求,只不过返回的响应中没有具体的内容,用于获取报头。
l PUT 从客户端向服务器传送的数据取代指定的文档的内容。
l DELETE 请求服务器删除指定的页面。
l TRACE 回显服务器收到的请求,主要用于测试或诊断。
l CONNECT HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。
l OPTIONS 允许客户端查看服务器的性能。
2、什么是Http协议?
“Http”协议称为是“超文本传输协议”(HTTP-Hypertext transfer protocol)。它定义了浏览器怎么向万维网服务器请求万维网文档,以及服务器怎么样把文档传送给浏览器,从层次的角度看,Http是面向应用层协议,它是万维网能够可靠的交换文件的重要基础,并且详细的规定了客户端浏览器与服务器之间互相通信的规则。Http是一个基于TCP/IP通信协议来传递数据(HTML文件、图片文件等)l 客户端发送给服务器的”信”,我们称之为”请求协议”。l 服务器端发送给浏览器的”信”,我们称之为”响应协议”。注意:使用HttpWatch抓包工具可以抓取HTTP协议的内容。
3、GET和POST的请求方法如何使用?
要知道请求方法如何使用,我们首先需要了解 HTTP 的请求报文结构,HTTP 的请求报文结构由3部分组成,分别是请求行、请求头、请求数据组成。
请求行:
由请求方法(Method)、URL 字段和 HTTP 的协议版本组成,注意其中的空格、回车符和换行符均不可省略,所以我们的请求方法实际上就是位于请求行中的了。
请求头部:
位于请求行之后,个数可以为 0~若干个,每个请求头部都包含一个头部字段名和一个值,它们之间用冒号":" 分隔,在最后用回车符和换行符表示结束。
请求数据:
如果请求方法为 GET,那么请求数据为空。它主要是在POST 中进行使用,适用于需要填表单(FORM)的场景。
HTTP 的 GET 请求报文是什么样的,我们这里可以访问https://api.github.com/search/users?q=JakeWharton 为例,通过抓包我们得到的请求报文如下所示:
GET/search/users?q=JakeWharton HTTP/1.1
Host: api.github.com
Connection: keep-alive
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0(Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko)Chrome/73.0.3683.86 Safari/537.36
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
Accept-Encoding: gzip,deflate, br
Accept-Language:zh-CN,zh;q=0.9
Cookie:_octo=GH1.1.1623908978.1549006668; _ga=GA1.2.548087391.1549006688;logged_in=yes; dotcom_user=GoMarck; _gid=GA1.2.17634150.1554639136; _gat=1
我们重点看到:
请求行:GET/search/users?q=JakeWharton HTTP/1.1
请求方法:GET 请求
URL:/search/users?q=JakeWharton
协议:HTTP1.1
请求行下面部分全都是请求头部,我们可以看到host 为api.github.com,连接方式为长连接等信息。值得注意的是我们这个例子中是不存在请求数据的。
POST / HTTP/1.1
Host: www.wrox.com
User-Agent: Mozilla/5.0(Windows; U; Windows NT 5.1; en-US; rv:1.7.6)Gecko/20050225 Firefox/1.0.1
Content-Type:application/x-www-form-urlencoded
Content-Length: 40
Connection: Keep-Alivename=Professional%20Ajax&publisher=Wiley
可以看到请求行中
请求方法:POST
URL :空
协议版本:HTTP1.1
它和上面 GET方法例子不一样的地方在于它的请求参数是位于请求数据中的,可以看到name=Professional%20Ajax&publisher=Wiley 就是它的请求数据。并且我们要注意到在请求数据和请求头之间是空出一行的,这是必不可少的。
4、Http的主要特点
-
简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET、HEAD、POST。每种方法规定了客户与服务器联系的类型不同。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。
-
灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。
-
无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。
-
无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。
-
支持B/S及C/S模式。
5、Get请求方法的特点
(1)get请求即请求的数据会附在 URL 之后(放在请求行中),以 ? 分割 URL 和传输数据,多个参数用 & 连接。
(2)根据 HTTP 规范,GET 用于信息获取,而且应该是安全和幂等的 。
(3)安全性指的是非修改信息,即该操作用于获取信息而非修改信息。换句话说,GET请求一般不应产生副作用,也就是说,它仅仅是获取资源信息,就像数据库查询一样,不会修改,增加数据,不会影响资源的状态。
(4)幂等性 (Idempotence) 则指的是无论调用这个URL多少次,都不会有不同的结果的 HTTP 方法。而在实际过程中,这个规定没有那么严格。例如在一个新闻应用中,新闻站点的头版不断更新,虽然第二次请求会返回不同的一批新闻,该操作仍然被认为是安全的和幂等的,因为它总是返回当前的新闻。
(5)GET 是会被浏览器主动缓存的,如果下一次传输的数据相同,那么就会返回缓存中的内容,以求更快地展示数据。
(6)GET 方法的 URL 一般都具有长度限制,但是需要注意的是 HTTP 协议中并未规定 GET 请求的长度。这个长度限制主要是由浏览器和 Web 服务器所决定的,并且各个浏览器对长度的限制也各不相同。
(7)GET 方法只产生一个 TCP 数据包,浏览器会把请求头和请求数据一并发送出去,服务器响应 200 ok(返回数据)。
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的状态码含义
①大致可分为五大类
100-199 信息,服务器收到请求,需要请求者继续执行操作。指定客户端应响应的某些动作。
200-299 用于表示请求成功。
300-399 重定向,需要进一步的操作以完成请求
400-499 用于指出客户端的错误。请求包含语法错误或无法完成请求
500-599 用于支持服务器错误。服务器在处理请求的过程中发生了错误
②常见的状态码
206 部分内容。服务器成功处理了部分GET请求
301 永久移动。请求的资源已被永久的移动到新URI,返回信息会包括新的URI,浏览器会自动定向到新URI。今后任何新的请求都应使用新的URI代替。
302 临时移动。与301类似。但资源只是临时被移动。客户端应继续使用原有URI
400 (错误请求)服务器不理解请求的语法。
404 (未找到)服务器找不到请求的网页。
500 (服务器内部错误)服务器遇到错误,无法完成请求。
505 (HTTP 版本不受支持) 服务器不支持请求中所用的 HTTP 协议版本。
不知道大家是怎么理解并记住状态码的,小编有个朋友是这么记的:
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地址可以被Bookmark |
不可以 |
编码 |
请求只能进行url编码 |
支持多种编码方式 |
参数数据类型 |
只接受ASCII字符 |
没有限制 |
请求设置 |
请求会被浏览器主动cache |
不会,除非手动设置 |
请求数据是否保留 |
保留在浏览器历史记录中 |
不会保留在浏览器历史记录中 |
请求方式 |
比较常见的方式是通过url地址栏请求 |
最常见是通过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-type:application/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就只发送一次。
转:光荣之路公众号文章