2024年最新版Ajax+Axios 学习【包含原理、Promise、报文、接口等...】

基础知识

AJAX概念

AJAX概念:是浏览器与服务器进行数据通信的技术。

认识URL

定义:统一资源定位符,简称网址,用于访问网络上的资源。

组成:

image-20240826144615311

  • http协议:超文本传输协议,规定浏览器和服务器之间传输数据的格式。
  • 域名:标记服务器在互联网中方位。
  • 资源位置:标记资源在服务器下的具体位置。

查询参数

定义:浏览器提供给服务器的额外信息,让服务器返回浏览器想要的数据。

语法:http://xxxx.com/xxx/xxx?参数名1=值1&参数名2=值2

常用请求方式

请求方式:对服务器资源,要拽行动的操作

请求方法操作
GET获取数据
POST数据提交
PUT修改数据(全部)
DELETE删除数据
PATCH修改数据(部分)

报文

HTTP协议:规定了浏览器发送及服务器返回内容的格式。

请求报文

请求报文:浏览器按照HTTP协议要求的格式,发送给服务器的内容。

请求报文由以下几个部分组成:

  1. 请求行:包含请求方法、URL和协议。
  2. 请求头:以键值对格式携带的附加信息,例如 Content-Type
  3. 空行:用于分隔请求头,空行之后是发送给服务器的资源。
  4. 请求体:实际发送给服务器的资源。
调试窗口查看报文

在浏览器任意页面右键找到检查或者直接F12键打开调试窗口。

然后找到网络,找到Fetch/XHR

image-20240826153410687

然后就可以在调试窗口里面查看报文信息啦!

请求头在标头中观看:

image-20240826152112828

响应头就在响应标头中查看:

image-20240826153658420

请求标头保存请求头的信息:

image-20240826152245507

可以点击原始显示原始的请求头信息

请求体在载荷中观看:

image-20240826152517373

响应体就在响应中查看:

image-20240826153553551

如果响应的内容比较多的时候,可以在预览窗口查看,就会以json数据的格式呈现出来。

image-20240826153641096

响应报文

响应报文:服务器按照HTTP协议要求的格式,返回给浏览器的内容。

它由以下几个部分组成:

  1. 响应行(状态行):包含协议、HTTP响应状态码和状态信息。
  2. 响应头:以键值对格式携带的附加信息,例如 Content-Type
  3. 空行:用于分隔响应头,空行之后是服务器返回的资源。
  4. 响应体:实际返回给浏览器的资源。
HTTP响应状态码

HTTP响应状态码:用来表明请求是否成功完成

状态码说明
1xx信息
2xx成功
3xx重定向消息
4xx客户端错误
5xx服务端错误

接口文档

接口文档:由后端提供的描述接口的文章

接口:使用AJAX和服务器通讯时,使用的URL请求方法,以及参数

Axios

基本使用

使用方法:

  1. 引入axios:https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js

    • 可以使用console.log(axios)检验是否拿到了axios对象
  2. 使用axios函数

    使用方法:1. 传入配置对象。2. 再用.then回调函数接收结果,并做后续处理。axios({url:‘目标资源地址’
    }).then((返回结果)=>{//在then回调函数中,第一个参数就是服务端返回的数据结果//对服务器返回的数据做后续的处理
    })
    

查询参数

语法:使用axios提供的params选项

模版:

axios({url:''params:{参数名:值}
}).then(res =>{//方法
})

⚠️注意:axios在运行时把参数名和值,会拼接到url?参数名=值

请求配置

语法:使用axios提供的 mothed选项

模版:

  • method:请求的方法(get可以省略不写)
  • data:提交数据
axios({url:'',params:{ 参数名:值 },method:'请求方法',data:{参数名:值}
}).then(res =>{//方法
})

错误处理

语法:在then方法的后面,通过点语法调用catch方法,传入回调函数并定义形参

模版:

axios({//请求选项
}).then(res =>{//处理数据
}).catch(err =>{//错误处理
})

AJAX原理

XMLHttpRequest

定义:XMLHttpRequest(XHR)对象用于与服务器交互。axios内部采用XMLHttpRequest与服务器交互。

使用步骤:

  1. 创建一个XHR对象

    const xhr = new XMLHttpRequet()
    
  2. 调用open方法,配置请求方法请求url地址

    xhr.open(请求方式,请求路径)
    
  3. 监听loadend事件,接受响应结果

    xhr.addEventListener('loadend',() = >{//console.log(xhr.response)//转化为json对象console.log(JSON.parse(xhr.response))
    })
    
  4. send方法发起请求

    xhr.send()
    

image-20240827230530172

查询参数

直接在open方法中拼接查询字符串:

xhr.open(get,请求路径?参数名=参数值&参数名2=参数值2&...)

URLSearchParams

将对象格式数据,转化为查询字符串

const obj = new URLSearchParams({对象名1,对象名2...
})
const str = obj.toString()const xhr = new XMLHttpRequet()
xhr.open(请求方式,请求路径?${str})

提交参数

const xhr = new XMLHttpRequet()
xhr.open(post,请求路径)
xhr.addEventListener('loadend',() = >{//console.log(xhr.response)//转化为json对象console.log(JSON.parse(xhr.response))
})
//请求体参数步骤:
// 1. 设置请求头数据类型,根据接口文档设置application/json
xhr.setRequestHeader('Content-Type','applicatio/json')
// 2.在send方法中携带参数
const obj ={username:'',password:''
}
//3.转化成字符串
const data = JSON.stringfy(obj)xhr.send(data)

封装简易axios(了解)

步骤:

  1. 定义一个函数,接受配置对象,返回Promise对象

    function myAxios(option){const { url,method } = optionreturn new Promise((resolve,reject) => {})
    }
    
  2. 发起XHR请求

    function myAxios(option){const { url,method } = optionreturn new Promise((resolve,reject) => {const xhr = new XMLHttpRequestxhr.open(method,url)xhr.addEventListener('loadend', ()=>{})xhr.send()})
    }
    
  3. 调用成功或失败的处理程序

    function myAxios(option){const { url,method } = optionreturn new Promise((resolve,reject) => {const xhr = new XMLHttpRequestxhr.open(method,url)xhr.addEventListener('loadend', ()=>{resolver(xhr.response)})xhr.send()})
    }
    
  4. 使用封装的函数

    myAxios({url:'',method:''
    }).then(res => {console.log(res)
    })
    

如果需要查询参数:

  1. 调用函数的时候传入params参数

    myAxios({url:'',method:'',params:{参数1:值1...}
    }).then(res => {console.log(res)
    })
    
  2. 基于URLSearchParmas转化并携带url上

    let { url,method,params } = optionparams = parmas ? new URLSearchParmas(params).toString():''
    url = params ? url+'?' +params:url
    

如果需要请求参数

  1. 同样的先调用函数传入data 参数

  2. 解构data

    let { url,method,params,data } = option
    
  3. 设置data

    if(data){//1. 设置请求头xhr.setRequestHeader('Content-Type','application/json')//2. 处理数据// data = JSON.stringify(data)//3. 发送请求
    }else{xhr.send(JSON.stringfy(data))
    }
    
  4. 错误处理

    if(xhr.status >= 200 && xhr.status < 300){resolver(JSON.parse(xhr.response))
    }else{reject(new Error(xhr.response))
    }
    

Promise

Promise对象用于表示一个异步操作的最终完成(或失败)及其结果值。

好处:

  1. 逻辑更清晰

  2. 了解axios函数内部运作机制

  3. 能解决回调函数地狱问题

语法:

  1. 创建Promise对象

    const p = new Promise(function(成功,失败){ })
    //一般写成以下👇形式
    
  2. 执行异步操作并传递结果

    const p = new Promise(function (resolve,reject){resolve('成功')
    })
    
    1. 成功调用:resolve(值)触发then
    2. 失败调用:reject(值)触发catch
  3. 接受结果

    p.then(result => {//成功})
    p.catch(error => {//失败})
    

Promise三种状态

作用:了解Promise对象如何关联的处理函数,以及代码执行顺序。

概念:一个Promise对象,必然处于以下几种状态之一

状态含义
待定(pending)初始状态,既没有被兑现,也没有被拒绝
已兑现(fulfilled)意味着,操作成功完成
已拒绝(rejected)意味着,操作失败

状态凝固:Promise的特性,一旦状态从pending修改为其他状态后就不会再次修改了。

image-20240827234930659

Promise+XHR

  1. 创建Promise对象

  2. 在Promise对象中使用XHR

  3. 接受结果,使用Promise对象

    const p = new Promise(function(resolve,reject){const xhr = new XMLHttpRequest()xhr.open(请求方式,请求地址)xhr.addEventListener('loadend',() => {//成功resolve(xhr.response)//失败//reject(xhr.response)})xhr.send()
    })p.then(result => {//成功})
    p.catch(error => {//失败})
    

同步与异步

同步代码:逐行执行,需原地等待结果后才继续向下执行。

异步代码:调用后耗时,不阻塞代码继续执行(不必原地等待),在将来完成后触发一个回调函数。(例子:定时器、Axios、事件)

小习题:

image-20240828120518764

答案:image-20240828120606177

由此可知,异步代码是通过回调函数来接受结果

回调地狱问题

概念:回调函数嵌套回调函数就是回调地狱

缺点:可读性差,异常无法获取,耦合性严重,牵一发动全身。

链式调用

概念:依靠then()方法会返回一个新生成的Promise对象特性,继续串联下一环任务,直到结束,then回调函数中的返回值会影响新生成的Promise对象最终状态和结果。

then回调函数中,return的值传给了新的Promise对象。

Promise链式调用的作用是解决了回调函数嵌套的问题。

image-20240828143905526

const p = new Promise((resolver,reject) => {resolve('成功1')
})p.then(res => P{console.log(res)	//这里打印的是('成功1')return new Promise((resolve,reject) =>{resolve(res + '成功2')	})}).then(res => {console.log(res)	//这里打印的是(res + '成功2')	})
async、await关键字

定义:async函数是使用async关键字声明的函数。async函数是一个构造函数的实例,并且其中允许使用awai关键字。asyncawait关键字让我们可以用一种更加简洁的方式写出基于Promise的异步行为,而无需刻意地链式调用Promise

使用方法:在async函数内,使用await关键字取代then函数,等待获取Promise对象成功状态的结果值。

模版:

async function render(){const res = await axios({url:'',method:''})
}
//调用async
render()

注意:

  • await必须用在async修饰的函数内
  • await会组织“异步函数内”代码继续执行,原地等待结果
async函数错误处理

因为async函数只能获取成功状态的结果值,如果发生错误了,这个时候就要使用到try...catch方法来捕获错误。try...catch语句标记要尝试的语句块,并指定一个出现异常时抛出的响应。

语法:

try{//要执行的代码
} catch(error){//error接受的是错误信息
}

那么我们直接跟上面的代码进行修改:

async function render(){try{const res = await axios({url:'',method:''})} catch(err){console.log(new Error(err))	//错误处理}
}
//调用async
render()

事件循环

原因:JavaScript单线程(某一刻只能执行一行代码),为了让耗时代码不阻塞其他代码运行,设计了事件循环模型(EventLoop)。

定义:执行和收集异步任务的模型(机制),在调用栈空闲的时候,会反复调用任务列表里面回调函数的执行机制,叫做事件循环。

执行过程:

  1. 执行同步代码,遇到异步代码交给宿主环境执行
  2. 异步有了结果后,把回调函数放入任务队列排队

示例:

image-20240828151551507

这段代码示例,展示了如何使用console.log函数和setTimeout函数来打印数字到控制台。不过,它并不是一个“时间循环”,而是展示了JavaScript中的异步执行和事件循环机制。

  1. console.log(1); 立即执行,打印数字1到控制台。
  2. setTimeout(function() { console.log(2); }, 0); 设置了一个定时器,当定时器到期时,会将一个匿名函数加入到事件队列中。这个定时器设置的延迟是0毫秒,意味着它将在当前执行栈清空后的下一个事件循环迭代中执行。打印数字2。
  3. console.log(3); 立即执行,打印数字3到控制台。
  4. setTimeout(function() { console.log(4); }, 2000); 设置了另一个定时器,延迟2000毫秒后执行,打印数字4。
  5. console.log(5); 立即执行,打印数字5到控制台。

执行顺序如下:

  • 首先打印1。
  • 然后设置第一个定时器,但不会立即执行。
  • 接着打印3。
  • 然后打印5。
  • 事件循环继续,第一个定时器到期后执行,打印2。
  • 2000毫秒后,第二个定时器到期执行,打印4。

所以,最终的打印顺序是:1, 3, 5, 2, 4。

宏任务与微任务

ES6之后引入了Promise对象,让JS引擎也可以发起异步任务。

异步任务分为:

  • 宏任务:由浏览器环境执行异步代码
    • js脚本执行事件
    • 定时器
    • AJAX请求完成事件
    • 用户交互事件
  • 微任务:由JS引擎环境执行的异步代码
    • Promise对象.then()方法(⚠️注意:Promise本身是同步的,而then和catch回调函数是异步的)

执行顺序:

  1. 执行第一个script脚本事件宏任务,里面同步代码。
  2. 遇到宏任务/微任务交给数组环境,由结果回调函数进入对应队列
  3. 当执行栈空闲的时候,清空微任务队列,在执行下一个宏任务,循环往复。

image-20240828153247517

示例:

image-20240828153006087

Promise.all方法

作用:合并多个Promise对象,等待所有完成(或某一个失败),做后续逻辑

image-20240828154018301

语法:

const p = Promise.all([Promise对象,Promise对象,...])
p.then(resule =>{	//result结果
}).catch(error =>{//第一个失败的Promise对象,抛出的异常
})

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1523853.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

程序设计—基于JavaWeb的流浪动物救助网站(案例分析)

摘 要 21世纪的今天&#xff0c;随着社会的不断发展与进步&#xff0c;人们对于信息科学化的认识&#xff0c;已由低层次向高层次发展&#xff0c;由原来的感性认识向理性认识提高&#xff0c;管理工作的重要性已逐渐被人们所认识&#xff0c;科学化的管理&#xff0c;使信息…

OpenAI API in node gives basic Await error. How do I fix?

题意&#xff1a;OpenAI API 在 Node 中出现基本的 Await 错误。我该如何修复&#xff1f; 问题背景&#xff1a; I literally copied the code from the openAI example and it gives me a remedial Await JS error but I am unsure what it expects me to do. I just want t…

【开源风云】从若依系列脚手架汲取编程之道(三)

&#x1f4d5;开源风云系列 &#x1f34a;本系列将从开源名将若依出发&#xff0c;探究优质开源项目脚手架汲取编程之道。 &#x1f349;从不分离版本开写到前后端分离版&#xff0c;再到微服务版本&#xff0c;乃至其中好玩的一系列增强Plus操作。 &#x1f348;希望你具备如下…

基于zigbee的蔬菜大棚温湿度监测系统(论文+源码)

1 系统的功能及方案设计 本次基于zigbee的蔬菜大棚温湿度监测系统主要包括传感器节点、协调器节点和监控中心三个功能模块。 其中协调器节点&#xff1a;由cc2530作为主控芯片&#xff0c;负责接收终端一和终端二发送过来的温湿度数据&#xff0c;并将其通过ch340串行转USB输…

【王树森】RNN模型与NLP应用(8/9):Attention(个人向笔记)

前言 基于RNN的Seq2Seq模型无法记住长序列Attentnion机制可以大幅度提升Seq2Seq模型 Seq2Seq Model with Attention Attention可以让句子在逐步变长的时候不忘记前面的输入信息Attention还可以告诉Decoder应该关注哪一个状态优点&#xff1a;Attention可以大幅度提高准确率缺…

【Java】实体类Javabean

文章目录 前言一、实体类Javabean是什么&#xff1f;二、代码总结 前言 记录实体类的基本语法 一、实体类Javabean是什么&#xff1f; 其实就是一种特殊形式的类&#xff0c;这种类特殊点在于&#xff1a; 1、这个类中的成员变量都要私有&#xff0c;并且要对外提供相应的ge…

Dubbo ZooKeeper Spring Boot整合

依赖配置 1. Dubbo 起步依赖 Dubbo 是一款高性能的 Java RPC 框架&#xff0c;用于快速开发高性能的服务。 <dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo-spring-boot-starter</artifactId><version>${dubbo.ver…

【功能自动化】使用HTMLTestRunner生成测试报告

配置环境&#xff1a; 部署webtours网站 准备数据 user.txt 在软件开发过程中&#xff0c;测试是非常重要的环节&#xff0c;通过测试可以验证代码的正确性和稳定性。而生成测试报告则是测试的一个重要环节&#xff0c;通过测试报告可以清晰地了解测试的结果、覆盖率等信息。…

第九届世界渲染大赛国内参赛者作品在哪里可以看?

第九届世界渲染大赛汇聚了全球顶尖的CG艺术家&#xff0c;其中国内选手的表现尤为引人注目。他们凭借独特的创意视角和精湛的技术&#xff0c;将浓郁的国风元素融入作品之中&#xff0c;为大赛增添了一抹独特的东方色彩。接下来&#xff0c;就让我们一探究竟&#xff0c;看看这…

datagrip链接sql server2005报错

错误信息 第一次报 DBMS: Microsoft SQL Server (no ver.) Case sensitivity: plainmixed, delimitedexact [08S01] 驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接。错误:“The server selected protocol version TLS10 is not accepted by client pr…

C++学习笔记----6、内存管理(一)---- 使用动态内存(4)

3.6、多维自由内存空间上的数组 如果需要在运行时决定多维数组的维度&#xff0c;可以使用在自由内存空间上的数组。与一维动态分配的数组通过指针访问一样&#xff0c;多维动态分配的数组也可以通过指针访问。不同的地方在于在二维数组中&#xff0c;需要用一个指向指针的指针…

基于精益六西格玛管理方法进行生产线综合改善

生产线精益六西格玛改善是一个系统工程&#xff0c;只有对其进行系统的策划与组织&#xff0c;才能收到良好的改善效果。一般来说&#xff0c;需要成立一个专门的精益六西格玛推进组织&#xff0c;由其完成一系列的组织、准备工作。具体如下&#xff1a; &#xff08;1&#xf…

详解si5338 si53xx 设计使用及STM32 iic驱动设计

背景 在实际项目中经常使用si5338 si53xx&#xff0c;进行多路时钟的倍频以生成想要的时钟信号&#xff0c;但是针对si5338 si53xx设计使用缺少相关的资料&#xff0c;本文详解si5338 si53xx 设计使用及STM32 iic驱动设计&#xff0c;本文使用工程在项目中得到测试&#xff0c…

【pycharm】汉化及翻译插件

汉化插件 翻译插件 使用 选中右键翻译

通信算法之232: 无线发射功率和信号强度,常用单位dB、dBm、dBi和dBd介绍

[转载] 无线功率和信号强度的基本概念 在无线网络中&#xff0c;使用AP设备和天线来实现有线和无线信号互相转换。如下图所示&#xff1a; 有线网络侧的数据从AP设备的有线接口进入AP后&#xff0c;经AP处理为射频信号&#xff0c;从AP的发送端&#xff08;TX&#xff09;经过…

DCMM认证等级以及费用多少?

DCMM&#xff08;数据管理能力成熟度&#xff09;特别适合拥有较多数据量的组织、以及期望在初期就进行数据管理规范的组织。它旨在帮助组织对象发现自身问题&#xff0c;为数据管理能力的建设和提升指明方向。 DCMM将组织的数据管理划分为 8大能力域&#xff0c;细分为28个能…

如何将代理IP设置为ISP:详细指南

在当今互联网时代&#xff0c;代理IP已经成为许多用户保护隐私和提升网络体验的重要工具。而ISP&#xff08;Internet Service Provider&#xff09;的代理IP更是因为其高质量和稳定性备受青睐。本文将详细介绍如何将代理IP设置为ISP&#xff0c;让你在网络世界中享受更优质的上…

如何在D盘创建虚拟环境?包括安装PyTorch和配置PyCharm

摘要&#xff1a;本文首先在D盘创建了虚拟环境&#xff0c;然后在虚拟环境中安装了PyTorch&#xff0c;最后配置了pycharm的解释器。 1. 在 D 盘创建虚拟环境 打开Anaconda Prompt 输入conda info --envs查看当前已有环境 创建自己的虚拟环境&#xff0c;打算命名为py310&…

不同分辨率下页面自适应方法

首先在utils文件下新建一个js文件命名为screenSize.js 然后在需要做自适应的页面文件中引入import {screenSize} from ‘/utils/screenSize’ 最外层div中用ref命名 最后在mounted中使用该方法 记得style中给login宽1920px,高1080px

CPP继承(下)

目录 继承与友元 继承与静态成员 复杂的菱形继承及菱形虚拟继承 单继承 多继承 菱形继承 菱形继承的问题 虚继承 虚拟继承解决数据冗余和二义性的原理 继承的总结和反思 笔试面试题 继承与友元 友元关系不能继承&#xff0c;也就是说基类友元不能访问子类私有和保护…