关于网络请求的面试题总结

本文首发于掘金,各位可以通过点击文章下方的阅读原来来访问原文地址

网络相关的知识也是面试时经常会被问到的问题,面试官很有必要确认面试者是否只会使用$.ajax()方法,还是真正了解网络请求的原理。

问题列表

  1. get和post的区别
  2. websocket是否了解
  3. http 2.0对于http 1.x有哪些优点?
  4. jq的ajax返回值是什么?
  5. 说一说你知道的HTTP状态码
  6. jsonp的原理
  7. 跨域请求资源有哪几种方式?他们的优缺点是什么?
  8. XML和JSON的区别?

答案列表

1.get和post的区别

这题看上很简单,你肯定能答出1个以上的区别,但是面试官往往期望你能答出更多更深层次的区别。

这篇文章写的很详细了,大家可以研究一下——get和post区别?(链接地址:https://www.zhihu.com/question/28586791)

我在这里在概括一下:

初级的答案

因为GET方法请求的参数都是放在请求的url上的,所以它与POST有以下明显的区别:

  • GET请求可以被添加到书签中,也可保存在浏览器历史记录中,POST不能
  • GET请求可以被浏览器缓存,POST不能
  • GET请求收到URL长度限制,所以数据长度也受限制,POST不会
  • GET请求只能传输ASCII字符,而POST不受此限制,还可以传输二进制数据

在语义上两个方法也有区别:

  • GET 代表获取指定服务器上资源
  • POST 代表向指定的资源提交要被处理的数据

高级些的答案

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

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

而对于POST,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据)。

也就是说,GET只需要汽车跑一趟就把货送到了,而POST得跑两趟,第一趟,先去和服务器打个招呼“嗨,我等下要送一批货来,你们打开门迎接我”,然后再回头把货送过去。

但是需要多解释两句的是:

  • 据研究,在网络环境好的情况下,发一次包的时间和发两次包的时间差别基本可以无视。而在网络环境差的情况下,两次包的TCP在验证数据包完整性上,有非常大的优点。
  • 并不是所有浏览器都会在POST中发送两次包,Firefox就只发送一次。

2.websocket是否了解?

通常情况下,面试官问你是否对XX有了解,一般的回答都是要涵盖下面这些点:

  • 是否知道它是什么?
  • 是否知道它的用途是什么?
  • 它和之前某项已有的技术相比,有哪些优缺点?

webSocket和http一样,同属于应用层协议。它最重要的用途是实现了客户端与服务端之间的全双工通信,当服务端数据变化时,可以第一时间通知到客户端。

除此之外,它与http协议不同的地方还有:

  • http只能由客户端发起,而webSocket是双向的。
  • webSocket传输的数据包相对于http而言很小,很适合移动端使用
  • 没有同源限制,可以跨域共享资源

要想了解更多详细,还是去看阮一峰的教程吧——WebSocket 教程 - 阮一峰的网络日志(链接:http://www.ruanyifeng.com/blog/2017/05/websocket.html)

3.http 2.0对于http 1.x有哪些优点?

优点(以下摘自HTTP/2.0 相比1.0有哪些重大改进?):

  • 多路复用:多路复用允许同时通过单一的 HTTP/2 连接发起多重的请求-响应消息。由于http 1.x的时代中,浏览器向同一域名下发送的http请求数量是受限的,当超出数量限制时,请求会被阻塞,大大降低了用户体验。而HTTP/2 的多路复用允许同时通过单一的 HTTP/2 连接发起多重的请求-响应消息。
  • 二进制分帧:HTTP/2在应用层和传输层之间追加了一个二进制分帧层,最终使得多个数据流共用一个连接,更加高效的使用tcp连接。从而使得服务器的连接压力减轻,降低了内存的消耗,增大了网络的吞吐量。
  • 首部压缩:HTTP/2引入了HPACK算法对头部进行压缩,大大减小了数据发送的字节数。

4.jQuery的ajax返回值是什么?

很多公司,尤其是金融或数据分析的公司,他们的web app会与服务端进行大量的数据交互,所以他们的面试官通常会很看重面试者对于网络请求以及异步编程的理解程度。

jQuery中的ajax大家很常用,以至于绝大部分人把他认为是“理所应当”,而忽略了他的底层逻辑和实现原理。$.ajax()方法返回的是一个延迟对象,即$.Deferred的实例。

所以你可以像下面这样使用$.ajax()方法

如果你想让这两个请求都完成后再进行处理的话,可以用下面的操作:

想要了解更多关于延迟对象的内容,可以访问阮一峰的博客(链接:http://www.ruanyifeng.com/blog/2011/08/a_detailed_explanation_of_jquery_deferred_object.html)

除了上面这一个问题,还可以追问一些下面的问题,这里就不展开解答了:

  • 异步请求和同步请求的区别
  • ajax 请求有几种数据格式,如何设置数据格式
  • 如何避免浏览器缓存get请求,以便达到每次get请求都能获取最新的数据
  • 等等……

5.说一说你知道的HTTP状态码

以前遇到面试者说 HTTP状态码不应该是前端开发关心的事情。但我总觉得一个前端工程师对于http状态码的了解程度代表了他曾经踩过了多少雷,一个深入了解http状态码的工程师可以快速定位问题。

关于HTTP状态码应该有下面的基本认识:

  • 1xx :1开头的状态码表示临时的响应
  • 2xx :请求成功
  • 3xx :请求被重定向
  • 4xx :请求错误,表明客户端发送的请求有问题
  • 5xx :服务器错误,表明服务端在处理请求时发生了错误

知道上面的规律,再看到错误的时候就大概知道问题是后端的锅还是前端的锅了。

再说几个常用的http状态码(如果有兴趣了解详细的话还是自己去找吧,网上很多):

  • 301 : Moved Permanently 客户端请求的文档在其他地方,新的URL在location头中给出
  • 304 : Not Modified 客户端有缓存的文档并发出了一个条件性的请求(一般是提供If-Modified-Since头表示客户端只想到指定日期后再更新文档)。服务器告诉客户,原来缓存的文档还可以继续使用。
  • 400 : Bad Request 请求出现语法错误
  • 401 : Unauthorized 访问被拒绝,客户端试图胃镜授权访问受密码保护的页面
  • 403 : Forbidden 资源不可用。服务器理解客户的请求,但拒绝处理它。通常由于服务器文件或目录的权限设置导致。
  • 404 : Not Found 无法找到指定位置的资源。
  • 405 : Method Not Allowed 请求方法(GET、POST、PUT等)对指定的资源不适用,用来访问本资源的HTTP方法不被允许。
  • 500 : Internal Server Error 服务器遇到了意料之外的情况,不能完成客户端的请求。
  • 502 : Bad Gateway 服务器作为网管或者代理时收到了无效的响应。
  • 503 : Service Unavailable 服务不可用,服务器由于维护或者负载过中未能应答。
  • 504 : Gateway Timeout 网关超时, 作为代理或网关的服务器不能及时的应答。

6.JSONP的原理

JSONP是一种跨域共享资源的方法。

很多人会好奇JSONP和JSON是什么关系,JSONP是JSON with padding的缩写,即填充式JSON或参数式JSON,是被包含在函数调用中的JSON,如下面的样子:

JSONP是通过动态<script>元素来实现的,使用时可以为src属性指定一个跨域URL。由于浏览器加载脚本是不受同源规则限制的,所以即使是跨域的URL同样可以发送请求。因为JSONP是有效的JavaScript代码,所以再请求完成后,即在JSONP响应加载到页面中以后,就会立即执行。

示例代码:

所以总结一下JSONP的实现方式:

  1. 向当前页面中动态插入一个<script>元素,src属性设置为请求地址,并在地址中指定好回调函数
  2. js代码中预先定义好jsonp的回调函数
  3. 请求完成后,会立即调用预先指定好的jsonp回调,并将数据以json的格式传递到回调中。

JSONP之所以可以实现跨域,依赖的是下面的条件:

  1. 浏览器请求脚本是不受同源规则限制的
  2. <script>元素加载完成的脚本会立即执行

需要注意的是,JSONP是需要服务端配合的,因为JSONP返回的是一段代码。

7.跨域请求资源有哪几种方式?他们的优缺点是什么?

常见的跨域方式如下:

  • JSONP
  • 图像Ping
  • CORS
  • Web Sockets

一个一个说:

JSONP

优点:简单易用,浏览器支持好。

缺点:

  1. JSONP是从其他域中加载代码并执行,所以存在很多安全隐患,如果其他服务器在响应中夹带恶意代码的话,没有办法防范。
  2. JSONP难以确定请求失败的情况。HTML5中给<script>元素增加了一个onerror事件,但是还是有浏览器不支持。
  3. 只能发送GET请求

图像Ping

这是指通过请求图片的方式来跨域发送请求。

优点:简单,兼容性好,不需要服务器做针对性处理。

缺点:

  1. 只能单向通信,即客户端发送信号给服务端,无法接收到服务端的回复
  2. 只能发送GET请求
  3. 容易被浏览器缓存请求,导致请求发送不出去。

CORS

CORS是Cross-Origin Resource Sharing的缩写,即跨域资源共享。CORS的基本思想就是使用自定义的HTTP头部让浏览器与服务器进行沟通,从而决定请求或响应是应该成功,还是应该失败。

优点:功能强大

缺点:

  1. 需要服务端来配合实现(其实很简单~)
  2. IE必须IE10以上。。。

WebSocket

这个貌似就不用多说了,属于没用过也应该听过的一种技术。

优点:

  1. 双工通信,浏览器和服务器都可以发起请求
  2. 通信效率高,一次链接可以复用,省去反复的握手环节

缺点:

  1. 实现上较为复杂,包括客户端和服务端
  2. 浏览器支持问题

还有很多其他的跨域方式,在这里就不说了

8.XML和JSON的区别?

XML是标准通用标记语言 (SGML) 的子集,而标签语言(如HTML)的好处就是易懂。

优点:上手简单,非开发人员也可以快速上手(产品经理们很喜欢)。

缺点:

  1. XML多余的数据比较多,所以数据量大,传输时占用更多空间
  2. 客户端和服务端解析XML都要比较繁琐,需要大量代码

JSON(JavaScript Object Notation, JS 对象标记) 是一种轻量级的数据交换格式。重点在轻上,结构与JavaScript中的Object类似。

优点:

  1. 数据量小,利于网络传输
  2. 方便解析,客户端和服务端都有基础的解析方法

缺点:结构稍微有点复杂,非开发人员不容易上手(初学者需要去官网学习研究一下)

原文发布于微信公众号 - 较真的前端(gh_7af41a2be77e)

原文发表时间:2018-02-23

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏java一日一条

Spring Boot + Mybatis + Redis二级缓存开发指南

Spring-Boot因其提供了各种开箱即用的插件,使得它成为了当今最为主流的Java Web开发框架之一。Mybatis是一个十分轻量好用的ORM框架。Red...

793
来自专栏Google Dart

AngularDart 4.0 高级-HTTP 客户端 顶

大多数前端应用程序使用HTTP协议与后端服务进行通信。 Dart网络应用程序通常使用XMLHttpRequest(XHR)API执行此操作,使用dart:htm...

641
来自专栏zaking's

RFC2616-HTTP1.1-Header Field Definitions(头字段规定部分—译文)

part of Hypertext Transfer Protocol -- HTTP/1.1

353
来自专栏芋道源码1024

IntelliJ IDEA 2018.2 发布,支持 Java 11

近期,JetBrains发布了其旗舰产品IntelliJ IDEA的2018.2版本。新版本支持即将推出的Java 11、断点意图(Breakpoints In...

1127
来自专栏Java帮帮-微信公众号-技术文章全总结

JavaWeb08-XML,tomcat,HTTP轻松入门

XML&tomcat&HTTP 一.XML基础知识 1. xml介绍 XML 指可扩展标记语言(EXtensible Markup Language),也是一种...

3569
来自专栏pythonlove

Linux防火墙iptables(二)

上一篇文章我们说了一些iptables/netfilter的基础知识,本文我们来介绍一下iptables的规则编写。Iptables的规则可以概括的分为两个方面...

802
来自专栏有趣的Python

Scrapy分布式爬虫打造搜索引擎-(八)elasticsearch结合django搭建搜索引擎Python分布式爬虫打造搜索引擎

Python分布式爬虫打造搜索引擎 基于Scrapy、Redis、elasticsearch和django打造一个完整的搜索引擎网站 八、elasticsear...

3416
来自专栏小筱月

Java web 前端面试知识点总结

耦合性:也称块间联系。指软件系统结构中各模块间相互联系紧密程度的一种度量。模块之间联系越紧密,其耦合性就越强,模块的独立性则越差。模块间耦合高低取决于模块间接口...

972
来自专栏Java技术栈

IntelliJ IDEA 2018.2 发布,支持 Java 11

近期,JetBrains发布了其旗舰产品IntelliJ IDEA的2018.2版本。新版本支持即将推出的Java 11、断点意图(Breakpoints In...

641
来自专栏北京马哥教育

面试分享系列 | 17道Python面试题,让你在求职中无往不利

今天给大家分享的是Python面试题系列的第一篇文章,后续我也会陆续整理Python相关的问题给大家,无论是求职者还是新人都可以通过面试题来考察自己的能力缺陷。...

3114

扫码关注云+社区