1、什么是GET 和 POST ?
GET 和 POST 其实都是 HTTP 的请求方法。除了这 2 个请求方法之外,HTTP 还有 HEAD、PUT、DELETE、TRACE、CONNECT、OPTIONS 这 6 个请求方法。所以HTTP的请求方法共计有 8 种,每个请求方法和描述如下:
- GET 请求指定的页面信息,并返回实体主体。
- POST 向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的建立和/或已有资源的修改。
- HEAD 类似于get请求,只不过返回的响应中没有具体的内容,用于获取报头。
- PUT 从客户端向服务器传送的数据取代指定的文档的内容。
- DELETE 请求服务器删除指定的页面。
- TRACE 回显服务器收到的请求,主要用于测试或诊断。
- CONNECT HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。
- OPTIONS 允许客户端查看服务器的性能。
2、什么是Http协议?
“Http”协议称为是“超文本传输协议”(HTTP-Hypertext transfer protocol)。它定义了浏览器怎么向万维网服务器请求万维网文档,以及服务器怎么样把文档传送给浏览器,从层次的角度看,Http是面向应用层协议,它是万维网能够可靠的交换文件的重要基础,并且详细的规定了客户端浏览器与服务器之间互相通信的规则。
Http是一个基于TCP/IP通信协议来传递数据(HTML文件、图片文件等)
- 客户端发送给服务器的”信”,我们称之为”请求协议”。
- 服务器端发送给浏览器的”信”,我们称之为”响应协议”。
注意:使用HttpWatch、fiddler、charles等抓包工具可以抓取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-Alive
name=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(返回数据)。