GET和POST的区别
HTTP请求方法
说GET和POST之前就先来看一下什么是HTTP吧。
超文本传输协议(HTTP)的设计目的是保证客户机与服务器之间的通信。
HTTP 的工作方式是客户机与服务器之间的请求-应答协议。
web 浏览器可能是客户端,而计算机上的网络应用程序也可能作为服务器端。
举例:客户端(浏览器)向服务器提交HTTP请求;服务器向客户端返回响应。响应包含关于请求的状态信息以及可能被请求的内容。
HTTP的请求方法有以下的八种:
1\. GET 向服务器获取指定资源
2\. HEAD 与GET一致,只不过响应体不返回,只返回响应头
3\. POST 向服务器提交数据,数据放在请求体里
4\. PUT 与POST相似,只是具有幂等(注1)特性,一般用于更新
5\. DELETE 删除服务器指定资源
6\. TRACE 回显服务器端收到的请求,测试的时候会用到这个
7\. CONNECT 预留,暂无使用
8\. OPTIONS 返回服务器所支持的请求方法
以上内容来自w3cschool
所以从上数据可以看出:
- GET 用于获取信息,是无副作用的,是幂等的,且可缓存
2. POST 用于修改服务器上的数据,有副作用,非幂等,不可缓存
随便一个计算机从业人员都可以说出一些他们的区别,例如:
1. GET方法用于信息获取,它是安全的(安全:指非修改信息,如数据库方面的信息),而POST方法是用于修改服务器上资源的请求;
2. GET请求的数据会附在URL之后,而POST方法提交的数据则放置在HTTP报文实体的主体里,所以POST方法的安全性比GET方法要高;
3. GET方法传输的数据量一般限制在2KB,其原因在于:GET是通过URL提交数据,而URL本身对于数据没有限制,但是不同的浏览器对于URL是有限制的,比如IE浏览器对于URL的限制为2KB,而Chrome,FireFox浏览器理论上对于URL是没有限制的,它真正的限制取决于操作系统本身;POST方法对于数据大小是无限制的,真正影响到数据大小的是服务器处理程序的能力。
本质上,GET和POST是没有区别的,他们都是http协议中的两种发送请求的方法,而http是基于TCP/IP的关于数据如何在万维网中通信的协议
HTTP的底层是TCP/IP。所以GET和POST的底层也是TCP/IP,也就是说,GET/POST都是TCP链接。你要给GET加上request body,给POST带上url参数,技术上是完全行的通的。
再来看看HTTP报文
报文格式上,不带参数时,最大区别就是第一行方法名不同POST方法请求报文第一行是这样的
POST /uri HTTP/1.1 \r\n
GET方法请求报文第一行是这样的
GET /uri HTTP/1.1 \r\n
是的,不带参数时他们的区别就仅仅是报文的前几个字符不同而已带参数时报文的区别呢? 在约定中,GET 方法的参数应该放在 url 中,POST 方法参数应该放在 body 中举个例子,如果参数是 name=qiming.c, age=22。GET 方法简约版报文是这样的
GET /index.php?name=qiming.c&age=22 HTTP/1.1
Host: localhost
POST 方法简约版报文是这样的
POST /index.php HTTP/1.1
Host: localhost
Content-Type: application/x-www-form-urlencoded
name=qiming.c&age=22
POST 方法会产生两个TCP数据包?
有些文章中提到,post 会将 header 和 body 分开发送,先发送 header,服务端返回 100 状态码再发送 body。
HTTP 协议中没有明确说明 POST 会产生两个 TCP 数据包,而且实际测试(Chrome)发现,header 和 body 不会分开发送。
所以,header 和 body 分开发送是部分浏览器或框架的请求方法,不属于 post 必然行为。
注释
1. 幂等 在编程中一个幂等操作的特点是其任意多次执行所产生的影响均与一次执行的影响相同。幂等函数,或幂等方法,是指可以使用相同参数重复执行,并能获得相同结果的函数。这些函数不会影响系统状态,也不用担心重复执行会对系统造成改变。例如,“setTrue()”函数就是一个幂等函数,无论多次执行,其结果都是一样的.更复杂的操作幂等保证是利用唯一交易号(流水号)实现.