硬核知识点——浏览器中的三类五种请求

关注公众号“执鸢者”,回复“红宝书”获取“javaScript高级程序第四版(pdf)”及大量前端学习资料。

对浏览器的请求进行划分,可以分为三类:一般请求、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'
    });
    

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发送请求。<br/>
>(1)fetch(input[, init]):接收两个参数,input为要获取的资源,__init为一个配置对象,配置需要传入的参数,满足更多复杂的需求<br/>
>(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还是比较有意思的,本次只说一下其简单使用,**下一期准备剖析一下其源码,有兴趣的小伙伴可以先搬好小板凳占个坑,关注一下。**

// 默认配置 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)

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属性获取其有效载荷。

本篇文章虽然比较简单,但是可以帮助我们认清楚请求其实是分为三类的,这是我最最最大的收获,欢迎小伙伴们能够给出自己的想法。

1.如果觉得这篇文章还不错,来个分享、点赞吧,让更多的人也看到

2.关注公众号执鸢者,领取学习资料,定期为你推送原创深度好文

本文由博客群发一文多发等运营工具平台 OpenWrite 发布

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 《程序员必知的硬核知识大全》是一本面向程序员的综合性知识手册,涵盖了各个领域的关键知识点,旨在帮助程序员提升技术水平和解决实际问题。该书以PDF格式出版,便于读者在电脑、手机等设备上随时查阅。 该书内容包括以下几个方面的硬核知识: 1. 编程语言知识:介绍了主流的编程语言,如Java、C++、Python等,包括语法、数据结构、算法等方面的内容。 2. 操作系统和计算机原理:详细介绍了操作系统的基本原理和常见问题解决方法,以及计算机组成原理和计算机网络等相关知识。 3. 数据库和存储知识:讲解了数据库设计和管理的基本原理,介绍了关系型数据库如MySQL和非关系型数据库如MongoDB等的使用方法和优化技巧。 4. 网站和网络开发知识:包括Web开发的基本原理、前后端开发技术、网络安全和性能优化等方面的内容。 5. 软件工程和开发方法论:介绍了软件工程的基本概念和常用开发方法,包括敏捷开发、测试驱动开发和持续集成等。 6. 设计模式和架构知识:详细介绍了常用的设计模式和软件架构,帮助程序员设计可维护、可扩展和高效的软件系统。 除了以上几个方面的内容,该书还涵盖了其他与程序员工作密切相关的技术和知识,如版本控制、软件部署、性能调优等。《程序员必知的硬核知识大全》适合本科或者有一定编程经验的程序员阅读,对于提高技术实力和职业发展都有很大帮助。 ### 回答2: "程序员必知的硬核知识大全 pdf"是一份提供程序员必备知识的电子书,PDF格式可以方便地在各种设备上阅读。这本书包含了各个方面的硬核知识,帮助程序员提高技术能力和解决问题的能力。 这本电子书的内容包括了数据结构和算法,编程语言,操作系统,网络通信,数据库管理等各方面的知识。对于程序员而言,这些都是非常重要的基础知识,能够帮助他们理解和设计高效的程序。 在数据结构和算法部分,程序员将学习到各种基础的数据结构,如数组、链表、栈和队列,以及常见的算法,如排序和搜索算法。这些知识对于程序的效率和性能优化至关重要。 编程语言部分将介绍多种编程语言,如C、C++、Java和Python等。这些语言在不同的领域有各自的优点和适用范围,程序员需要了解它们的特点和使用方法,以便在开发项目时选择合适的语言。 操作系统部分将深入讲解操作系统的原理和设计。程序员将了解到进程管理、内存管理、文件系统等重要概念,这些对于编写具有高可靠性和高性能的程序至关重要。 网络通信部分将介绍计算机网络的基本原理和常见的协议,如TCP/IP和HTTP等。程序员需要理解网络通信的基础知识,以便与其他系统进行数据交换和通信。 数据库管理部分将详细介绍关系型数据库和非关系型数据库的原理和使用方法。程序员需要了解数据库的设计和优化,以提高数据的存储和检索效率。 总之,这本电子书涵盖了程序员必备的硬核知识,对于提高他们的技术能力和解决问题的能力非常有帮助。 ### 回答3: 《程序员必知的硬核知识大全》是一本汇集了程序员必备的核心知识的书籍,可以帮助程序员提升自己的技术水平。这本书涵盖了计算机科学的各个领域和重要概念,包括数据结构与算法、操作系统、编程语言、网络通信、数据库、Web开发、软件工程等。 在数据结构与算法部分,书介绍了常用的数据结构如链表、栈、队列以及各种排序和搜索算法,帮助程序员理解和应用这些经典的算法。在操作系统方面,书讲解了进程、线程、内存管理、文件系统等重要概念,帮助程序员深入了解计算机系统的工作原理。 在编程语言方面,书列举了多种编程语言的特性和应用场景,如C++、Java、Python等,有助于程序员选择适合自己的编程语言并掌握其特性。在网络通信部分,书介绍了TCP/IP协议、HTTP协议等重要的网络通信协议和技术,帮助程序员理解网络通信的基本原理。 此外,书还介绍了数据库的相关知识,包括关系数据库、SQL语言、数据备份与恢复等内容,有助于程序员设计和管理数据库。在Web开发方面,书介绍了前端开发、后端开发、服务器部署等关键技术,帮助程序员构建高效、安全的Web应用程序。 最后,在软件工程方面,书讲解了软件开发的生命周期、需求分析、设计模式、测试和持续集成等内容,有助于程序员理解和掌握软件开发过程的重要环节。 总的来说,这本《程序员必知的硬核知识大全》提供了一站式的学习资料,涵盖了程序员必备的核心知识,可以帮助程序员系统地学习和应用这些知识,提升自己的技术能力。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值