POST请求与GET请求(面试题)

1、原理区别php

通常咱们在浏览器输入一个网址访问网站都是GET请求;再FORM表单中,能够经过设置Method指定提交方式为GET或者POST提交方式,默认为GET提交方式。html

HTTP定义了与服务器交互的不一样方法,其中最基本的四种:GET,POST,PUT,DELETE,HEAD,其中GET和HEAD被称为安全方法,由于使用GET和HEAD的HTTP请求不会产生什么动做。不会产生动做意味着GET和HEAD的HTTP请求不会在服务器上产生任何结果。可是安全方法并非什么动做都不产生,这里的安全方法仅仅指不会修改信息。web

根据HTTP规范,POST可能会修改服务器上的资源的请求。好比CSDN的博客,用户提交一篇文章或者一个读者提交评论是经过POST请求来实现的,由于再提交文章或者评论提交后资源(即某个页面)不一样了,或者说资源被修改了,这些即是“不安全方法”。面试

2、表现形式区别浏览器

搞清楚了二者的原理区别后,咱们来看一下在实际应用中的区别。缓存

首先,咱们先看一下HTTP请求的格式:安全

<method> <request-URL> <version>
<headers>

<entity-body>

在HTTP请求中,奇异行必须是一个请求行,包括请求方法,请求URL,报文所用HTTP版本信息。紧接着是一个herders小节,能够有零个或一个首部,用来讲明服务器要使用的附加信息。在首部以后就是一个空行,最后就是报文实体的主体部分,包含一个由任意数据组成的数据块。可是并非全部的报文都包含实体的主体部分。服务器

GET请求实例:网络

GET http://weibo.com/signup/signup.php?inviteCode=2388493434
Host: weibo.com
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8

POST请求实例:并发

POST /inventory-check.cgi HTTP/1.1
Host: www.joes-hardware.com
Content-Type: text/plain
Content-length: 18

item=bandsaw 2647

接下来看看两种请求方式的区别:

一、GET请求,请求的数据会附加在URL以后,以?分割URL和传输数据,多个参数用&链接。URL的编码格式采用的是ASCII编码,而不是uniclde,便是说全部的非ASCII字符都要编码以后再传输。

POST请求:POST请求会把请求的数据放置在HTTP请求包的包体中。上面的item=bandsaw就是实际的传输数据。

所以,GET请求的数据会暴露在地址栏中,而POST请求则不会。

二、传输数据的大小

在HTTP规范中,没有对URL的长度和传输的数据大小进行限制。可是在实际开发过程当中,对于GET,特定的浏览器和服务器对URL的长度有限制。所以,在使用GET请求时,传输数据会受到URL长度的限制。

对于POST,因为不是URL传值,理论上是不会受限制的,可是实际上各个服务器会规定对POST提交数据大小进行限制,Apache、IIS都有各自的配置。

三、安全性

POST的安全性比GET的高。这里的安全是指真正的安全,而不一样于上面GET提到的安全方法中的安全,上面提到的安全仅仅是不修改服务器的数据。好比,在进行登陆操做,经过GET请求,用户名和密码都会暴露再URL上,由于登陆页面有可能被浏览器缓存以及其余人查看浏览器的历史记录的缘由,此时的用户名和密码就很容易被他人拿到了。除此以外,GET请求提交的数据还可能会形成Cross-site request frogery攻击

四、HTTP中的GET,POST,SOAP协议都是在HTTP上运行的

3、HTTP响应

HTTP响应报文的格式

<version> <status> <reason-phrase>
<headers>

<entity-body>

status,状态码描述了请求过程当中发生的状况

reson-phrase 是数字状态码的可读版本

常见的状态码以及含义以下:

200 OK 服务器成功处理请求

301/302 Moved Permanently(重定向)请求的URL已移走。响应报文中应该包含一个Location URL,说明资源如今所处的位置

304 Not Modified(未修改) 客户的缓存资源是最新的,要客户端使用缓存内容

404 Not Found 未找到资源

501 Internal Server Error 服务器遇到错误,使其没法对请求提供服务

HTTP响应示例

HTTP/1.1 200 OK

Content-type: text/plain
Content-length: 12

Hello World!

面试题:GET和POST是HTTP请求的两种基本方法,它们的区别:
GET和POST是HTTP请求的两种基本方法,要说它们的区别,接触过WEB开发的人都能说出一二。

最直观的区别就是GET把参数包含在URL中,POST经过request body传递参数。

当你在面试中被问到这个问题,你的心里充满了自信和喜悦。
你轻轻松松的给出了一个“标准答案”:
GET在浏览器回退时是无害的,而POST会再次提交请求。
GET产生的URL地址能够被Bookmark,而POST不能够。
GET请求会被浏览器主动cache,而POST不会,除非手动设置。
GET请求只能进行url编码,而POST支持多种编码方式。
GET请求参数会被完整保留在浏览器历史记录里,而POST中的参数不会被保留。
GET请求在URL中传送的参数是有长度限制的,而POST么有。
对参数的数据类型,GET只接受ASCII字符,而POST没有限制。
GET比POST更不安全,由于参数直接暴露在URL上,因此不能用来传递敏感信息。
GET参数经过URL传递,POST放在Request body中。
若是我告诉你GET和POST本质上没有区别你信吗?

GET和POST是什么?HTTP协议中的两种发送请求的方法。

HTTP的底层是TCP/IP。因此GET和POST的底层也是TCP/IP,也就是说,GET/POST都是TCP连接。GET和POST能作的事情是同样同样的。你要给GET加上request body,给POST带上url参数,技术上是彻底行的通的。

GET和POST还有一个重大区别,简单的说:

GET产生一个TCP数据包;POST产生两个TCP数据包。

对于GET方式的请求,浏览器会把http header和data一并发送出去,服务器响应200(返回数据);
而对于POST,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据)。

也就是说,GET只须要汽车跑一趟就把货送到了,而POST得跑两趟,第一趟,先去和服务器打个招呼“嗨,我等下要送一批货来,大家打开门迎接我”,而后再回头把货送过去。
由于POST须要两步,时间上消耗的要多一点,看起来GET比POST更有效。所以Yahoo团队有推荐用GET替换POST来优化网站性能。但这是一个坑!跳入需谨慎。为何?

  1. GET与POST都有本身的语义,不能随便混用。
  2. 据研究,在网络环境好的状况下,发一次包的时间和发两次包的时间差异基本能够无视。而在网络环境差的状况下,两次包的TCP在验证数据包完整性上,有很是大的优势。
  3. 并非全部浏览器都会在POST中发送两次包,Firefox就只发送一次。

如今,当面试官再问你“GET与POST的区别”的时候,你的心里是否是这样的