计算机网络常问面试问题 5 ——GET和POST区别

GET和POST区别

0、HTTP方法的简单说明

在这里插入图片描述
上图HTTP开始行(又叫请求行)中包含请求方法(Method)URL 字段HTTP 的协议版本

“方法”是面向对象技术中使用的专门名词。所谓“方法”就是对所请求的对象进行的操作,因此这些方法实际上也就是一些命令。因此,请求报文的类型是由它所采用的方法决定的。
在这里插入图片描述

1、GET方法

1.1、定义

浏览器用GET请求从服务器上获取一个html页面/图片/css/js等资源。“读取“一个资源。比如Get到一个html文件。反复读取不应该对访问的数据有副作用,也就是不会修改数据。

  • 比如”GET一下,用户就下单了,返回订单已受理“,这是不可接受的。没有副作用被称为“幂等“(Idempotent)。
  • 因为GET因为是读取,就可以对GET请求的数据做缓存。这个缓存可以做到浏览器本身上(彻底避免浏览器发请求),也可以做到代理上(如nginx),或者做到server端(用Etag,至少可以减少带宽消耗)

在这里插入图片描述
get格式

请求的数据会附在 URL 之后(放在请求行中),以 ? 分割 URL 和传输数据,多个参数用 & 连接。

HTTP get请求实例:

GET /books/?sex=man&name=Professional 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
Connection: Keep-Alive
空行
请求数据为空

可以发现:

  • 1、URL中可以存储用户请求的个人信息sex=man&name=Professional
  • 2、请求数据为空

1.2、特征

  • 1、GET从服务器上获取数据,而且应该是安全和幂等的,即该操作用于获取信息而非修改信息 。
    • 在GET交互这里就是,对同一个URL的多个请求,得到的结果是相同的。就像数据库查询,不同的数据库连接对同一个数据库表用相同条件查询时,得到的结果也是一样的。
    • 幂等性 (Idempotence) 则指的是无论调用这个URL 多少次,都不会有不同的结果的 HTTP 方法。而在实际过程中,这个规定没有那么严格。例如在一个新闻应用中,新闻站点的头版不断更新,虽然第二次请求会返回不同的一批新闻,该操作仍然被认为是安全的和幂等的,因为它总是返回当前的新闻。
      在这里插入图片描述
  • 2、GET 是会被浏览器主动缓存的,如果下一次传输的数据相同,那么就会返回缓存中的内容,以求更快地展示数据。
  • 3、GET 方法的 URL 一般都具有长度限制,但是需要注意的是 HTTP 协议中并未规定 GET 请求的长度。
    • HTTP 协议没有 Body 和 URL 的长度限制,对 URL 限制的大多是浏览器和服务器的原因。
  • 4、GET 方法只产生一个 TCP 数据包,浏览器会把请求头和请求数据一并发送出去,服务器响应 200 ok(返回数据)。

2、POST方法

2.1、定义

Post:用来向目的服务器发出请求,要求它接受被附在请求后的实体,并把它当作请求队列中请求URI所指定资源的附加新子项。

  • 用POST来提交一个<form>表单,并得到一个结果的网页。浏览器的POST请求都来自表单提交。每次提交,表单的数据被浏览器用编码到HTTP请求的body里。浏览器发出的POST请求的body主要有有两种格式:
    • 一种是application/x-www-form-urlencoded用来传输简单的数据,大概就是"key1=value1&key2=value2"这样的格式。
    • 另外一种是传文件,会采用multipart/form-data格式。采用后者是因为application/x-www-form-urlencoded的编码方式对于文件这种二进制的数据非常低效。
  • 点击表单中的submit元素会发出一个POST请求让服务器做一件事。这件事往往是有副作用的,不幂等的
  • 不幂等也就意味着不能随意多次执行。因此也就不能缓存
    • 比如通过POST下一个单,服务器创建了新的订单,然后返回订单成功的界面。这个页面不能被缓存。试想一下,如果POST请求被浏览器缓存了,那么下单请求就可以不向服务器发请求,而直接返回本地缓存的“下单成功界面”,却又没有真的在服务器下单。那是一件多么滑稽的事情。

1、这里对x-www-form-urlencode格式简单说明:
在这里插入图片描述
可以发现,请求体(body)的参数实质上也是一个字符串,跟get请求放在URL后面的参数是一样的格式,参数1=值1&参数2=值2….. 整个字符串是被urlencode的,但是这里由于参数是纯英文字母并且不包含特殊字符体现不出来。

2、这里对Multipart/form-data格式简单说明:

既然body数据可以纯文本也可以纯二进制,那么可不可以是文本和二进制的混合型呢?这必须是可以的,因此有了Multipart/form-data格式。
在这里插入图片描述
form-data格式里,header里的Content-Type的值为 Content-Type: multipart/form-data; boundary={#boundary},接着是请求体变成了一种固定的格式,有多个提交”参数”,这里的”参数”可以是文本信息,也可以是二进制数据信息,这里的每一个参数被称为”part”,因此这种格式称为Multipart

HTTP post请求实例:

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

2.2、特征

  • 1、POST 表示可能修改变服务器上的资源的请求。
    • 例如我们在刷知乎的时候对某篇文章进行点赞,就是提交的 POST请求,因为它改变了服务器中的数据(该篇文章的点赞数)。
  • 2、POST 方法因为有可能修改服务器上的资源,所以它是不符合安全和幂等性的。
  • 3、从前面关于 POST 的请求报文也可以看出,POST 是将请求信息放置在请求数据中的
  • 4、因为 POST 方法的请求信息是放置在请求数据中的,所以它的请求信息是没有长度限制的。
  • 5、POST 方法会产生两个TCP数据包,浏览器会先将请求头发送给服务器,待服务器响应100 continue,浏览器再发送请求数据,服务器响应200ok(返回数据)。

3、GET和POST区别总结

GET是从服务器上获取数据,POST是向服务器传送数据。

  • 1、GET参数通过url传递,POST放在request body中,GET提交的数据会在地址栏中显示出来,而POST提交,地址栏不会改变。
  • 2、GET请求在url中传递的参数是有长度限制的,而POST没有
    • get提交的数据最大是2k(原则上url长度无限制,那么get提交的数据也没有限制咯?限制实际上取决于浏览器
    • post理论上没有限制。实际上IIS4中最大量为80KB,IIS5中为100KB。
  • 3、GET产生一个TCP数据包,POST产生两个TCP数据包。
    • 对于GET方式的请求,浏览器会把http header和data一并发送出去,服务器响应200(返回数据);
    • 对于POST,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据)
  • 4、GET请求会被浏览器主动cache,而POST不会,除非手动设置。
  • 5、GET请求只能进行url编码,而POST支持多种编码方式。
  • 6、关于安全性。无论是GET还是POST都不够安全,因为HTTP本身是明文协议。每个HTTP请求和返回的每个byte都会在网络上明文传播,不管是url,header还是body。
    • 为了避免传输中数据被窃取,必须做从客户端到服务器的端端加密。业界的通行做法就是https——即用SSL协议协商出的密钥加密明文的http数据。

参考

1、https://www.zhihu.com/search?type=content&q=GET%E5%92%8CPOST
2、https://blog.csdn.net/wswit/article/details/50776060
3、https://blog.csdn.net/Kurozaki_Kun/article/details/78646960

猜你喜欢

转载自blog.csdn.net/JMW1407/article/details/107580850