面试之Http协议中Get和Post请求之间到底有什么区别?
前言
面试中,面试官常常会问到,get请求和post请求到底有什么区别?
get和post的区别,你百度一下的话,可以看到百万条结果,每个人都有每个人的思考,这篇是我的思考,如果有些结论有不对或者误导的地方,希望各位大佬在评论区指正。我会在批评中不断提升.谢谢各位
了解Http协议
Http协议的特点
- 基于tcp/Ip、一种网络应用层协议、超文本传输协议HyperText Transfer Protocol
- 工作方式:客户端请求服务端应答的模式
- 无状态连接
- 可以传输任意对象,对象类型由Content-Type标记
- 请求request消息包括以下格式:请求行(request line)、请求头(header)、请求空行、请求体
如下图 为一个真实的请求报文 - 响应response也由四个部分组成,分别是:状态行、消息报头、空行、响应正文
如下图为一个真实的响应报文
Http协议的请求方法
HTTP/1.1协议中共定义了8种HTTP请求方法,HTTP请求方法也被叫做“请求动作”,不同的方法规定了不同的操作指定的资源方式。服务端也会根据不同的请求方法做不同的响应。
说到这里忽然想起一个Http/1.1和1.0的差别,它们的差别在于1.1会复用连接,而1.0不会!
-
GET
GET请求会显示请求指定的资源。一般来说GET方法应该只用于数据的读取,而不应当用于会产生副作用的非幂等的操作中。
GET会方法请求指定的页面信息,并返回响应主体,GET被认为是不安全的方法,因为GET方法会被网络蜘蛛等任意的访问。 -
HEAD
HEAD方法与GET方法一样,都是向服务器发出指定资源的请求。但是,服务器在响应HEAD请求时不会回传资源的内容部分,即:响应主体。这样,我们可以不传输全部内容的情况下,就可以获取服务器的响应头信息。HEAD方法常被用于客户端查看服务器的性能。 -
POST
POST请求会 向指定资源提交数据,请求服务器进行处理,如:表单数据提交、文件上传等,请求数据会被包含在请求体中。POST方法是非幂等的方法,因为这个请求可能会创建新的资源或/和修改现有资源。 -
PUT
PUT请求会身向指定资源位置上传其最新内容,PUT方法是幂等的方法。通过该方法客户端可以将指定资源的最新数据传送给服务器取代指定的资源的内容。 -
DELETE
DELETE请求用于请求服务器删除所请求URI(统一资源标识符,Uniform Resource Identifier)所标识的资源。DELETE请求后指定资源会被删除,DELETE方法也是幂等的。 -
CONNECT
CONNECT方法是HTTP/1.1协议预留的,能够将连接改为管道方式的代理服务器。通常用于SSL加密服务器的链接与非加密的HTTP代理服务器的通信。 -
OPTIONS
OPTIONS请求与HEAD类似,一般也是用于客户端查看服务器的性能。 这个方法会请求服务器返回该资源所支持的所有HTTP请求方法,该方法会用’*'来代替资源名称,向服务器发送OPTIONS请求,可以测试服务器功能是否正常。JavaScript的XMLHttpRequest对象进行CORS跨域资源共享时,就是使用OPTIONS方法发送嗅探请求,以判断是否有对指定资源的访问权限。 允许 -
TRACE
TRACE请求服务器回显其收到的请求信息,该方法主要用于HTTP请求的测试或诊断。 -
HTTP/1.1之后又增加了一些方法,在这里就不赘述了!
区别(正文开始)
嘿嘿上面讲了那么多,重点才来!
一般我们很容易就能说上来的区别如下
- 请求参数封装 get封装在请求行后 post封装在请求体
- 参数长度 get请求参数长度有限制 post请求参数长度无限制(浏览器之间的差别也不同)
- 编码方式 GET请求只能进行url编码,而POST支持多种编码方式。
- 安全问题 get不安全(get提交数据还可能会造成CSRF攻击。) post相对安全(这里的安全也只是相对的)
就按照这么说的话,我觉得并不会让面试官眼前一亮,都能说出来的东西并不新鲜!
这些其实都不是最重要最本质的区别.最本质的区别在于:
对于GET方式的请求,浏览器会把http header和data一并发送出去,服务器响应200(返回数据);
而对于POST,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据).
GET只需要汽车跑一趟就把货送到了,而POST得跑两趟,第一趟,先去和服务器打个招呼“嗨,我等下要送一批货来,你们打开门迎接我”,然后再回头把货送过去。
Http状态码附录
状态码1xx 等待
- 100 Continue:
服务器仅接收到部分请求,但是一旦服务器并没有拒绝该请求,客户端应该继续发送其余的请求。 - 101 Switching Protocols:
服务器转换协议:服务器将遵从客户的请求转换到另外一种协议。 - 102: 由WebDAV(RFC 2518):
扩展的状态码,代表处理将被继续执行
状态码2xx:成功
- 200 OK:
请求成功(其后是对GET和POST请求的应答文档。) - 201 Created:
请求被创建完成,同时新的资源被创建。 - 202 Accepted:
供处理的请求已被接受,但是处理未完成。 - 203 Non-authoritative Information:
文档已经正常地返回,但一些应答头可能不正确,因为使用的是文档的拷贝。 - 204 No Content:
没有新文档。浏览器应该继续显示原来的文档。如果用户定期地刷新页面,而Servlet可以确定用户文档足够新,这个状态代码是很有用的。 - 205 Reset Content:
没有新文档。但浏览器应该重置它所显示的内容。用来强制浏览器清除表单输入
内容 - 206 Partial Content:
客户发送了一个带有Range头的GET请求,服务器完成了它。
状态码3xx:重定向
- 300 Multiple Choices:
多重选择。链接列表。用户可以选择某链接到达目的地。最多允许五个地址。 - 301 Moved Permanently:
所请求的页面已经转移至新的url - 302 Found:
所请求的页面已经临时转移至新的url。 - 303 See Other:
所请求的页面可在别的url下被找到。 - 304 Not Modified:
未按预期修改文档。客户端有缓冲的文档并发出了一个条件性的请求(一般是提供If-Modified-Since头表示客户只想比指定日期更新的文档)。服务器告诉客户,原来缓冲的文档还可以继续使用。 - 305 Use Proxy:
客户请求的文档应该通过Location头所指明的代理服务器提取。 - 306 Unused:
此代码被用于前一版本。目前已不再使用,但是代码依然被保留。 - 307 Temporary Redirect:
被请求的页面已经临时移至新的url。
状态码4xx:客户端错误
- 400 Bad Request:
服务器未能理解请求。 - 401 Unauthorized:
被请求的页面需要用户名和密码。 - 401.1:
登录失败。 - 401.2:
服务器配置导致登录失败。 - 401.3:
由于 ACL 对资源的限制而未获得授权。 - 401.4:
筛选器授权失败。 - 401.5:
ISAPI/CGI 应用程序授权失败。 - 401.7:
访问被 Web 服务器上的 URL 授权策略拒绝。这个错误代码为 IIS 6.0 所专用。 - 402 Payment Required:
此代码尚无法使用。 - 403 Forbidden:
对被请求页面的访问被禁止。 - 404 Not Found:
服务器无法找到被请求的页面。 - 405 Method Not Allowed:
请求中指定的方法不被允许。 - 406 Not Acceptable:
服务器生成的响应无法被客户端所接受。 - 407 Proxy Authentication Required:
用户必须首先使用代理服务器进行验证,这样请求才会被处理。 - 408 Request Timeout:
请求超出了服务器的等待时间。 - 409 Conflict:
由于冲突,请求无法被完成。 - 410 Gone:
被请求的页面不可用。 - 411 Length Required:
“Content-Length” 未被定义。如果无此内容,服务器不会接受请求。 - 412 Precondition Failed:
请求中的前提条件被服务器评估为失败。 - 413 Request Entity Too Large:
由于所请求的实体的太大,服务器不会接受请求。 - 414 Request-url Too Long:
由于url太长,服务器不会接受请求。当post请求被转换为带有很长的查询信息的get请求时,就会发生这种情况。 - 415 Unsupported Media Type:
由于媒介类型不被支持,服务器不会接受请求。 - 416 Requested Range Not Satisfiable:
服务器不能满足客户在请求中指定的Range头。 - 417 Expectation Failed:
执行失败。 - 423:
锁定的错误。
状态码5** 服务端错误
- 500 Internal Server Error:
请求未完成。服务器遇到不可预知的情况。 - 501 Not Implemented:
请求未完成。服务器不支持所请求的功能。 - 502 Bad Gateway:
请求未完成。服务器从上游服务器收到一个无效的响应。 - 503 Service Unavailable:
请求未完成。服务器临时过载或宕机。 - 504 Gateway Timeout:
网关超时。 - 505 HTTP Version Not Supported:
服务器不支持请求中指明的HTTP协议版本。