Ajax原理-XMLHttpRequest

1. XMLHttpRequest

是什么?

和axios的关系:

axios 内部采用 XMLHttpRequest 与服务器交互

学习XMLHttpRequest的目的:

掌握使用 XHR 与服务器进行数据交互,了解 axios 内部原理,加强对知识的理解,提升技术认知。

1.1. 基本语法

步骤:

  1. 创建 XMLHttpRequest 对象
  2. 配置请求方法和请求 url 地址
  3. 监听 loadend 事件接收响应结果
  4. 发起请求

// 1. 创建 XMLHttpRequest 对象
const xhr = new XMLHttpRequest()
// 2. 配置请求方法和请求 url 地址
xhr.open('请求方法','请求url网址')
// 3. 监听 loadend 事件接收响应结果
xhr.addEventListener('loadend', () => {
//响应结果
console.log(xhr.response)
})// 4. 发起请求
xhr.send()

1.1.1. 获取省份案例

需求:获取并展示所有省份名字

接口地址

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head>
<body><div class="data"></div><script>// 1. 实例化XHR对象const xhr = new XMLHttpRequest()// 2. open方法设置请求方法和url路径xhr.open('GET','https://hmajax.itheima.net/api/province')// 3. 设定接收服务器的响应事件  loadend// loadend是XMLHttpRequest的一个事件,当服务器响应了不论是否成功都触发这个事件xhr.addEventListener('loadend',function(){// 获取服务器响应的结果(响应体的数据 xhr.response是一个字符串(JSON) )console.log(xhr.response)// 如何判断是成功还是失败的响应: xhr.status >=200 && xhr.status<300// console.log(xhr.status)if(xhr.status >=200 && xhr.status<300){// 成功let jsObj = JSON.parse(xhr.response)console.log(jsObj);//  其他的逻辑写在这里。。。。document.querySelector('.data').innerHTML = jsObj.list.join('<br>')}else{// 失败}            })// 4. send()发送请求xhr.send()</script>
</body>
</html>

1.2. 查询参数

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

语法:XXXX参数名1=值1&参数名2=值2

多个参数之间 用 & 符号分隔的键/值对列表

如何使用XMLHttpRequest发送携带参数的请求?

// 1. 创建 XMLHttpRequest 对象
const xhr = new XMLHttpRequest()
// 2. 配置请求方法和请求 url 地址
xhr.open('请求方法','请求url网址?key1=value1&key2=value2&.....')
// 3. 监听 loadend 事件接收响应结果
xhr.addEventListener('loadend', () => {
//响应结果
console.log(xhr.response)
})// 4. 发起请求
xhr.send()

1.2.1. 查询地区

需求:输入【省份】和【城市】名字点击查询按钮,获得地区列表

接口地址

开发步骤:

<!DOCTYPE html>
<html lang="zh-CN"><head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>案例_地区查询</title><link href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/5.1.3/css/bootstrap.min.css" rel="stylesheet"><style>:root {font-size: 15px;}body {padding-top: 15px;}</style>
</head><body><div class="container"><form id="editForm" class="row"><!-- 输入省份名字 --><div class="mb-3 col"><label class="form-label">省份名字</label><input type="text" value="广东省" name="province" class="form-control province" placeholder="请输入省份名称" /></div><!-- 输入城市名字 --><div class="mb-3 col"><label class="form-label">城市名字</label><input type="text" value="深圳市" name="city" class="form-control city" placeholder="请输入城市名称" /></div></form><button type="button" class="btn btn-primary sel-btn">查询</button><br><br><p>地区列表: </p><ul class="list-group area-group"><!-- 示例地区 --><li class="list-group-item">东城区</li></ul></div><script>document.querySelector('button').addEventListener('click', function () {let pname = document.querySelector('.form-control.province').valuelet cname = document.querySelector('.form-control.city').valueconst xhr = new XMLHttpRequest()// ✨✨✨带参数请求的核心代码就是在url后面使用?key=value&key1=value1传参xhr.open('GET', `https://hmajax.itheima.net/api/area?pname=${pname}&cname=${cname}`)xhr.addEventListener('loadend', function () {if (xhr.status >= 200 && xhr.status < 300) {// ✨✨✨将xhr.response 这个json字符串转成对象let jsObj = JSON.parse(xhr.response)console.log(jsObj);let str = ''jsObj.list.forEach(item => {str += `<li class="list-group-item">${item}</li>`})document.querySelector('.list-group').innerHTML = str}})xhr.send()})</script>
</body></html>

1.3. 提交数据(POST)

场景:将页面表单数据提交给服务器,例如:登录,注册,密码修改,新增,编辑等业务

XMLHttpRequest数据提交核心步骤:

  1. 请求头设置Content-Type
  2. 请求体携带符合要求的数据

举例:如下注册账号接口

  1. 请求头设置Content-Type: application/json
  2. 请求体携带 JSON 字符串

核心代码:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head>
<body><script src="./lib/axios.js"></script><script>// axios({//     url:'https://hmajax.itheima.net/api/register',//     method:'POST',//     data:{//         username:'itheima524',//         password:'12345678'//     }// })// .then(res=>{//     console.log(res.data)            // })const xhr = new XMLHttpRequest()xhr.open('POST','https://hmajax.itheima.net/api/register')xhr.addEventListener('loadend',function(){if(xhr.status>=200 && xhr.status <300){console.log(xhr.response)                }})// 在发送之前增加请求报文头Content-Typexhr.setRequestHeader('Content-Type','application/json')// xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded')// 准备请求体数据let userInfo = {username:'itheima536',password:'12345678'}//✨✨ 注意点:由于Contet-type是一个application/json,所以必须将对象转换成json字符串发送let userInfoBody = JSON.stringify(userInfo)// ✨✨ send()里面如果带了参数,表示向请求报文体中增加数据发送给服务器// get请求是无需带参数的,只有POST,PUT,PATCH这些方法才带参数xhr.send(userInfoBody)// xhr.send('username=itheima536&password=12345678')</script>
</body>
</html>

1.4. 文件上传

  1. 实例化FormData
  2. 使用append方法根据接口文档添加参数
  3. send方法发送formdata对象

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head>
<body><input type="file" class="img"><script>document.querySelector('.img').addEventListener('change',function(){// 1. 获取选择的图片let file = this.files[0]// 2. 实例化FormData对象const fd = new FormData()fd.append('img',file)const xhr = new XMLHttpRequest()xhr.open('POST','https://hmajax.itheima.net/api/uploadimg')xhr.addEventListener('loadend',function(){if(xhr.status >=200 && xhr.status<300){console.log(xhr.response)                    }else{alert('失败')}})// 3. 将formData对象提交给服务器xhr.send(fd)})</script>
</body>
</html>

1.5. XHR总结

XHR是什么? 浏览器提供的一个和服务器通讯的对象(XMLHttpReqeust)

和axios的关系是什么?axios库里面针对XHR来进行封装的

面试官:请手写一个和服务器通讯的ajax代码,不允许使用axios

核心步骤:

  1. 创建对象var xhr = new XMLHttpRequest();
  2. 配置请求xhr.open('GET', 'URL');
  3. 处理响应
    • 设置状态改变时的回调函数:xhr.addEventListener('loadend',function(){})
    • 检查 xhr.status >= 200 && xhr.status < 300 确认成功。
  1. 发送请求xhr.send();

  • GET请求核心要素
    • 修改open方法第一个参数为GET,第二个参数表示请求的url地址
      • URL地址如果需要带参数-> ?key=value&key1=value1
  • POST请求的核心要素
    • 在发送请求之前使用xhr.setReqeustHeader()设置Contnet-Type请求头
      • applicaton/json -> json字符串
      • application/x-www-form-urlencoded -> key=value&key1=value1
    • 在send方法中传入符合Content-type格式要求的数据
  • 文件上传的核心要素
    • 配合<input type="file">这个元素来实现的
    • 实例化FormData 以及使用append方法追加数据
    • send()方法将formdata对象发生给服务器
    • 注意点:文件上传不需要手动设置Contnet-Type

2. Promise + XHR 实现myAxios获取省份列表

目标:通过 Promise+XHR模拟axios函数的封装,体验axios内部的实现过程

需求:

  1. 使用 Promise 管理 XHR ,模拟实现一个简单版的myAxios
  2. 使用myAxios访问:http://hmajax.itheima.net/api/province 获取省份数据

实现步骤:

  1. 创建myAxios函数,内部使用返回一个 new Promise((resolve,reject)=>{ })
  2. 执行 XHR 异步代码,获取省份列表 接口文档
  3. 请求成功(xhr.status >= 200 && xhr.status < 300)或失败函数,做后续处理
    1. resolve(成功的数据)
    2. reject(失败数据)
<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head><body><!-- <script src="./lib/axios.js"></script> --><script>/* myAxios().then().catch()拆解:1. 构造出 能 .then().catch()2. 在Promise中通过XHR去和服务器通信3. 服务器响应的成功或者失败结果,由Promise中的resolve和reject交出去*/function myAxios() {return new Promise((resolve, reject) => {// resolve(100)// // reject('错误:100')// 借助XHR来发送请求和响应const xhr = new XMLHttpRequest()xhr.open('GET','https://hmajax.itheima.net/api/city?pname=广东省')xhr.addEventListener('loadend',function(){if(xhr.status >=200 && xhr.status <300){// 成功resolve(xhr.response)}else{reject('失败')}})xhr.send()})}myAxios().then(res=>{console.log(res);            }).catch(err=>{console.log(err);})// async function call() {//     try {//         let res = await myAxios()//         console.log(res);//     } catch (err) {//         console.log(err);//     }// }// call()</script>
</body></html>

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

离散数学 期末笔记

命题符号化 使用等值演算法证明 求公式范式 在自然推理体系中构造下列推理的证明 在一阶逻辑中将下列命题符号化 设A、B、C、D是 Z 的子集 证明下列集合恒等式 二元关系 性质 没有空的 没有漏的 没有重复 函数

Fabric环境部署-Git和Node安装

一.安装Git&#xff08;v2.43.0&#xff09; Git 是一个开源的分布式版本管理系统&#xff08;也是全球最大的开源软件存储服务器&#xff09;&#xff0c;用于敏捷高效地处理任何或小或大的项目。搭建区块链需要使用Git&#xff0c;因为区块链的开发和部署需要使用版本控制工…

springCloud 脚手架项目功能模块:Java分布式锁

文章目录 引言分布式锁产生的原因:集群常用的分布式锁分布式锁的三种实现方式I ZooKeeper 简介zookeeper本质上是一个分布式的小文件存储系zookeeper特性:全局数据一致性ZooKeeper的应用场景分布式锁(临时节点)II 基于ZooKeeper 实现一个排他锁创建锁获取锁释放锁Apache Zo…

stm32入门元件介绍

stm32入门元件介绍 文章目录 stm32入门元件介绍入门套件总览套件介绍面包板面包板跳线/飞线杜邦线STM32最小系统板STLINKOLED显示屏LED按键电位器蜂鸣器光敏/热敏电阻传感器/对射式/反射式红外传感器旋转编码器USB转串口MPU6050陀螺仪加速度计W25Q64 Flash闪存TB6612FNG电机驱动…

C语言:调试的概念和调试器的选择

所谓调试&#xff08;Dubug&#xff09;&#xff0c;就是跟踪程序的运行过程&#xff0c;从而发现程序的逻辑错误&#xff08;思路错误&#xff09;&#xff0c;或者隐藏的缺陷&#xff08;Bug&#xff09;。 在调试的过程中&#xff0c;我们可以监控程序的每一个细节&#xff…

Python深度学习GRU、LSTM 、BiLSTM-CNN神经网络空气质量指数AQI时间序列预测及机器学习分析|数据分享...

全文链接&#xff1a;https://tecdat.cn/?p38742 分析师&#xff1a;Zhixiong Weng 人们每时每刻都离不开氧&#xff0c;并通过吸入空气而获得氧。一个成年人每天需要吸入空气达6500升以获得足够的氧气&#xff0c;因此&#xff0c;被污染了的空气对人体健康有直接的影响&…

Flink源码编译与运行

1 准备 准备好Java 8环境和编译器&#xff08;如IDEA&#xff09;。 下载源码&#xff1a; 官网&#xff1a;https://flink.apache.org/downloads/。GitHub&#xff1a;https://github.com/apache/flink。 2 编译 在IDEA终端&#xff0c;使用下面命令之一编译源码&#xff…

Elasticsearch:Lucene 2024 年回顾

作者&#xff1a;来自 Elastic Chris Hegarty 2024 年对于 Apache Lucene 来说又是重要的一年。在本篇博文中&#xff0c;我们将探讨主要亮点。 Apache Lucene 在 2024 年表现出色&#xff0c;发布了许多版本&#xff0c;包括三年来的首次重大更新&#xff0c;其中包含令人兴奋…

(四)基于STM32通过Event Recoder实现时间测量功能

目录 1. 了解Event Recorder 2. 硬件和软件准备 硬件需求 软件需求 3. 配置STM32工程 使用STM32CubeMX初始化项目 配置Event Recorder 4. 实现时间记录功能 初始化Event Recorder 时间间隔计算 配置Debug选项 测量结果查看 5总结 在嵌入式系统开发中&#xff0c;精…

Java 内存溢出(OOM)问题的排查与解决

在 Java 开发中&#xff0c;内存溢出&#xff08;OutOfMemoryError&#xff0c;简称 OOM&#xff09;是一个常见且棘手的问题。相比于数组越界、空指针等业务异常&#xff0c;OOM 问题通常更难定位和解决。本文将通过一次线上内存溢出问题的排查过程&#xff0c;分享从问题表现…

Python、R用深度学习神经网络组合预测优化能源消费总量时间序列预测及ARIMA、xgboost对比...

全文链接&#xff1a;https://tecdat.cn/?p38726 分析师&#xff1a;Qingxia Wang 在能源领域&#xff0c;精准预测能源消费总量对制定合理能源战略至关重要。当前&#xff0c;能源消费预测分析主要运用单一模型&#xff08;如灰色预测法、时间序列分析法等&#xff09;和组合…

【LLM-Agent】Building effective agents和典型workflows

note Anthropic的工程经验&#xff1a; 大道至简&#xff0c;尽量维护系统的简洁&#xff1b;尽量让过程更加透明&#xff08;因为你依赖的是LLM的决策&#xff0c;如果只看输出不看过程&#xff0c;很容易陷入难以debug的情况&#xff09;&#xff1b;对LLM需要调用的工具&am…

音视频入门基础:MPEG2-PS专题(4)——FFmpeg源码中,判断某文件是否为PS文件的实现

一、引言 通过FFmpeg命令&#xff1a; ./ffmpeg -i XXX.ps 可以判断出某个文件是否为PS文件&#xff1a; 所以FFmpeg是怎样判断出某个文件是否为PS文件呢&#xff1f;它内部其实是通过mpegps_probe函数来判断的。从《FFmpeg源码&#xff1a;av_probe_input_format3函数和AVI…

CSS——5. 外部样式

<!DOCTYPE html> <html><head><meta charset"UTF-8"><title>方法3&#xff1a;外部样式</title><link rel"stylesheet" href"a.css" /><link rel"stylesheet" href"b.css"/&g…

lenovo联想IdeaPad 15sIML 2020款(81WB)笔记本电脑原装出厂OEM预装系统Windows10镜像下载

适用机型 &#xff1a;【81WB】 链接&#xff1a;https://pan.baidu.com/s/1SF9uWaNdCKPkwKgsCWb18g?pwdh6qe 提取码&#xff1a;h6qe 联想原厂WIN系统自带所有驱动、带Recovery恢复重置、出厂主题壁纸、系统属性联机支持标志、系统属性专属LOGO标志、Office办公软件、联想…

WPS表格技巧01-项目管理中的基本功能-计划和每日记录的对应

前言&#xff1a; 在项目管理中&#xff0c;一般就是用些项目管理工具来管理这个任务和 task&#xff0c;但是就是要学这些工具很麻烦&#xff0c;比较好的方法&#xff0c;通用的方法就是用 Excel 表格去做&#xff08;这非常适合松散的团队组织&#xff09;&#xff0c;然后…

《前端web开发-CSS3基础-1》

文章目录 《前端web开发-CSS3基础》1.CSS引入方式2.选择器-标签和类3.选择器-id和通配符选择器4.画盒子5.字体修饰属性6.字体大小、粗细和倾斜6.1字体大小6.2 字体粗细6.3字体倾斜 7.行高8.字体族9.font复合属性10.缩进、对齐和修饰线10.1 文本缩进10.2 文本和图片对齐10.3 文本…

Mac M2基于MySQL 8.4.3搭建(伪)主从集群

前置准备工作 安装MySQL 8.4.3 参考博主之前的文档&#xff0c;在本地Mac安装好MySQL&#xff1a;Mac M2 Pro安装MySQL 8.4.3安装目录&#xff1a;/usr/local/mysql&#xff0c;安装好的MySQL都处于运行状态&#xff0c;需要先停止MySQL服务最快的方式&#xff1a;系统设置 …

网络IP协议

IP&#xff08;Internet Protocol&#xff0c;网际协议&#xff09;是TCP/IP协议族中重要的协议&#xff0c;主要负责将数据包发送给目标主机。IP相当于OSI&#xff08;图1&#xff09;的第三层网络层。网络层的主要作用是失陷终端节点之间的通信。这种终端节点之间的通信也叫点…

密钥管理系统在数据安全解决方案中的重要性

密钥管理系统在数据安全解决方案中占据着举足轻重的地位&#xff0c;其重要性体现在以下几个方面&#xff1a;一、保障数据机密性 密钥管理系统通过生成、存储和管理加密密钥&#xff0c;确保了数据的机密性。这些密钥用于加密和解密数据&#xff0c;只有授权用户才能访问和使…