对浏览器的请求有几种?_第2页回答

2021-02-22 17:38发布

10条回答
我的网名不再改
2楼 · 2021-02-24 13:59

对浏览器的请求进行划分,可以分为三类:一般请求、Ajax请求、WebSocket请求,对于每种请求都有不同的产生方式,今天就以这个思想为主线来一起唠一唠。 

一、一般请求

此处说的一般请求就是指浏览器会直接显示响应体数据,这些请求会刷新\跳转页面。换个更加容易理解的说法吧,指的就是控制台Network面板中除了XHR和WS部分显示的请求。例如js、css、img资源。

二、Ajax请求

Ajax请求也是由浏览器发出,但是不会对界面进行任何操作,只是调用监视的回调函数并传入响应相关数据,发出Ajax请求可以通过三种方式:XHR、Fetch、Axios,其余的均不是Ajax请求。

2.1 XHR

最早将Ajax推到历史舞台的关键技术就是XMLHttpRequest(XHR)对象,虽然目前已经有了一些过时的嫌疑,但是还是很有必要提一下它。下面就按照一个请求的整个生命周期来看一看该技术。

一、 对象的实例化

既然要使用XHR,第一步就是要将该对象实例化

const xhr = new XMLHttpRequest();

二、初始化操作

将对象实例化后是不是紧接着就需要进行初始化操作,到底该请求要发给谁、通过什么请求发、该请求到底是同步发还是异步发

xhr.open(method, url, async)

三、请求头设置

了解网络的同学本肯定知道请求头的概念,既然要与后端打交道,请求头还是有必要进行设置的(默认的配置不一定满足我们高大上的需求),例如想发送json格式的内容,这个时候就需要设置Content-Type为application/json

xhr.setRequestHeader('Content-Type', 'application/json');

四、接收请求的准备工作

浏览器除了设置常见的请求头外,还需要指定响应数据类型,得到响应后好自动解析。目前支持的类型有string、arraybuffer、blob、document、json、text、ms-stream。

xhr.responseType('json')

五、发送请求

前期工作都准备好了,接下来就是激动人心的时刻了,看好呀,要按开始键发送请求啦。

xhr.send(data)

六、监听响应

我喊一声美女,人家肯定要回应一下呀,毕竟颜值在这,不回应该是多么不给面子的一件事呀!!!为了等待人家的回应,则需要分三步进行:

  1. 进入监听状态,放在这就是通过onreadystatechange进行监听。

  2. 等待正面回应。readyStatus表征目前的状态,当readyStatus为4(请求完成),响应算是接收到了

  3. 处理响应。不能一股脑的处理全部响应吧,毕竟也是要面子的人,我肯定只希望接收我喜欢的信息吧,就喜欢状态码在200~299之间的,别的一概pass掉。

    xhr.onreadystatechange = () => {
     if (xhr.readyState == 4) {
         if (xhr.status >= 200 && xhr.status < 300) {
             console.log(xhr.response);
         }
     }
    }

    七、中断请求

    正常流程算是走完了,肯定还有非正常流程,发起请求后我后悔了,不想得到对方的回应了,此时仍然后办法——中断请求

    xhr.abort()

    注:本文不是文档学习,详细使用请见https://developer.mozilla.org/zh-CN/docs/Web/API/XMLHttpRequest

    2.2 Fetch

    长江后浪推前浪,互联网技术发展这么快,出现了新的技术(Fetch)能够执行XMLHttpRequest对象的所有任务,该技术使用更容易,接口更现代化,能够在Web工作线程等现代Web工具中使用。(Fetch必须是异步,XMLHttpRequest可同步可异步)。

    const payload = JSON.stringify({
     test: 'test'
    });
    • 1

    • 2

    • 3

    • 1

    • 2

    • 3

    • 4

    • 5

    • 6

    let headersObj = new Headers({ 'Content-Type':'application/json' });

    let request = new Request('http://localhost:8080');

    fetch(request, { method: 'POST', body: payload, headers: headersObj }) .then((response) => response.json()) .then(console.log)

    > 上述代码虽然简单,但是已经囊括了Fetch API中所有的概念:fetch、Headers、Request、Response、Body混入。
    1. fetch()
    > fetch()方法暴露在全局作用域中,包括主页面执行线程、模块和工作线程,调用该方法,浏览器就会向给定URL发送请求。
    >(1)fetch(input[, init]):接收两个参数,input为要获取的资源,__init为一个配置对象,配置需要传入的参数,满足更多复杂的需求
    >(2)返回一个promise对象,从而链式的进行处理 2. Headers > 相当于 response/request 的头信息,可以使你查询到这些头信息,或者针对不同的结果做不同的操作。该对象包含检索、设置、添加、删除,设置完自己需要的头信息后就可以将其挂载到fetch中的配置信息中。 3. Request > 该对象是获取资源请求的接口,暴露了请求和相关信息。可以将该对象的实例作为fetch函数中的第一个参数 4. Response > 该对象是获取资源响应的接口,并暴露了响应的相关信息。 5. Body混入 > 提供了与 response/request 中的 body 有关的方法,可以定义它的内容形式以及处理方式。在Body混入中提供了5个方法,用于将ReadableStream转存到缓冲区的内存中,将缓冲区转换为某种JavaScript对象类型,以及通过Promise产生结果。 (1)Body.text():返回Promise,解决将缓冲区转存得到的UTF-8格式字符串 (2)Body.json():返回Promise,解决将缓冲区转存得到的JSON (3)Body.formData():返回Promise,解决将缓冲区转存得到的FormData实例 (4)Body.arrayBuffer():返回Promise,解决将缓冲区转存得到的ArrayBuffer (5)Body.text():返回Promise,解决将缓冲区转存得到的Blob实例 ### 2.3 Axios > Axios应该是目前前端最流行的Ajax请求库,具有以下特点: > 1. 基于Promise的异步Ajax请求库 > 2. 浏览器端/node端都可以使用 > 3. 支持请求/响应拦截器 > 4. 支持请求取消 > 5. 请求/响应数据转换 > 6. 批量发送请求 > 对于Axios还是比较有意思的,本次只说一下其简单使用,**下一期准备剖析一下其源码,有兴趣的小伙伴可以先搬好小板凳占个坑,关注一下。**12345678910111213141516171819202122232425262728293031

    // 默认配置 axios.defaults.baseURL = 'http://localhost:8080'

    // 请求拦截器 axios.interceptors.request.use( config => { console.log('request interceptor resolved'); return config; }, error => { console.log('request interceptor rejected'); return Promise.reject(error); } );

    // 响应拦截器 axios.interceptors.response.use( response => { console.log('response interceptor resolved'); return response; }, error => { console.log('response interceptor rejected'); return Promise.reject(error); } );

    let cancel; // 用于保存取消请求的函数 axios('/', { method: 'post', headers: { 'Content-Type': 'application/json' }, data: { test: 'test' }, // 取消请求 cancelToken: new axios.CancelToken((c) => { cancel = c; }) }) .then((response) => { console.log(response.data) })

    // 若想取消请求,直接调用下面函数 // cancel();

    > 上述代码已经囊括了Axios库中大多数核心内容,包括axios()函数、默认设置、请求/响应拦截器、取消请求(内部设计的很巧妙,想知道的请看下期讲解)
    1. axios()
    > 完成相应配置并发送请求,调用方式有多种语法糖,同学们可以按需使用。
    2. 默认设置
    > 通过axios.defaults.xxx可以完成很多全局配置,提高代码的复用。(提高复用真是完美的编码思想)
    3. 请求/响应拦截器
    > 请求拦截器的作用就是在请求发送之前先进行一些列的处理;响应拦截器的作用就是触发请求的回调之前执行响应拦截器,对响应做一些预处理操作
    4. 取消请求
    > 通过配置cancelToken对象并缓存用于取消请求的cancel函数,在需要的时候触发该函数取消请求(内部其实就是调用的xhr.abort())
    
    > 对于更多使用见详细使用文档https://github.com/axios/axios
    ## 三、WebSocket请求
    > 下面来聊聊这个传奇协议——WebSocket,WebSockt通过一个长时连接实现与服务器全双工、双向的通信。(特别提醒:同源策略不适用于WebSocket)123456789101112

    let ws = new WebSocket('ws://127.0.0.1:8080');

    // 在连接建立成功时 ws.onopen = () => { ws.send('websocket') }

    // 在接收到消息时 ws.onmessage = (event) => { console.log(event.data); }

    // 在发生错误时 ws.onerror = () => { console.log('error'); }

    // 在连接关闭时 ws.onclose = () => { console.log('close'); }

    ```

    上述代码已经囊括大部分WebSocket的概念,实例化WebSocket建立与服务端的连接;通过事件监听即可了解WebSokcet连接目前的状态;通过send()函数即可向服务端发送内容;当服务端发送消息时即可触发message事件,通过event.data属性获取其有效载荷。


    相关问题推荐

    • 回答 120

      相对前几年来说,要高上不少了,毕竟入行的人也是越来越多了,基础的工作对应想要参与的人群基数越来越大,但是对于高端人才的需求还是很多,人才还是相对稀缺性的。所以,想要学web或者其他技术也一样,别等,别观望。web前端就业方向特别多包括web前端开发...

    • 回答 25

      相对定位和绝对定位是定位的两种表现形式,区别如下:一、主体不同1、相对定位:是设置为相对定位的元素框会偏移某个距离。2、绝对定位:absolute 脱离文档流,通过 top,bottom,left,right 定位。二、特点不同1、相对定位:在使用相对定位时,无论是否进行移...

    • 抓包是什么意思?2020-04-01 17:36
      回答 7
      已采纳

      抓包(packet capture)就是将网络传输发送与接收的数据包进行截获、重发、编辑、转存等操作,也用来检查网络安全。抓包也经常被用来进行数据截取等。抓包可以通过抓包工具来查看网络数据包内容。通过对抓获的数据包进行分析,可以得到有用的信息。目前流行的...

    • 回答 89

      常用的前端框架有Bootstrap框架、React框架、Vue框架、Angular框架、Foundation框架等等

    • 回答 65
      已采纳

      前端是目的就业前景非常不错的一个计算机技术,但是自学的话还是有一定难度的,网络上自学是碎片化的,同时互联网技术跟新换代快,自己的话比较吃力也学习不到最新的技术。

    • SSR 是什么意思?2020-03-20 18:56
      回答 6

      SSR就是一台服务器,可以利用 SSR 在远程的服务器上配置 SSR,使其能够成为 SSR 节点,这样本地电脑或者其它设备利用 SSR 节点实现 VPN 或者远程上网及游戏加速等方面。ShadowsocksR(简称 SSR)是 Shadowsocks 分支,在 Shadowsocks 的基础上增加了一些数据...

    • 回答 52
      已采纳

      计算机培训方向比较多,建议找适合自己的方向选择培训编程类:JAVA、WEB、Python、C/C++、C#等测试类:软件测试运维类:云计算、网络安全设计类:UI设计、3D建模等

    • 回答 11

      1、代码判断xAxis: {type: &#39;time&#39;,splitLine: {show: false},interval: 3600, // 设置x轴时间间隔axisLabel: {formatter: function(value, index) {return liangTools.unix2hm(value)}}},首先要把xAxis 显示类型设置成time,然后设置对应X轴......

    • 回答 8

      HTML5 + CSS + JavaScript 开发 跨平台重用代码 

    • 回答 4

      采用rem单位自动响应,并提供独有栅格化系统快速定义宽高、边距节省css代码量,同时总结各大型移动端网页,提供一套ui颜色搭配规范,尺寸规范,字体规范等。

    • 回答 10

      iView UI、ioni、SUI

    • 回答 6

       jQTouch 

    • 回答 4

      如果只是普通的移动端用vue react 或者dva 如果是要编译成小程序什么的或者混生 就用uni-app(对应vue语法)taro(对应react) 或者纯原生 这个没有限制的,自己怎么舒服怎么来

    • 回答 4

      因为可以运用在网页和小程序的开饭中,而且开源,用着便宜,企业都很喜欢

    • 回答 10

      一、Visual Studio Code下载地址:https://code.visualstudio.com/微软在2015年4月30日Build 开发者大会上正式宣布了 Visual Studio Code 项目:一个运行于 Mac OS X、Windows和 Linux 之上的,针对于编写现代 Web 和云应用的跨平台源代码编辑器。Visual Stud...

    • 回答 9

      jQuery自带淡入淡出效果 https://www.w3school.com.cn/jquery/jquery_fade.asp 看看这个 

    没有解决我的问题,去提问