4 前端前置技术(上):AJAX技术、Axios技术(前端发送请求)

news2025/3/11 2:22:44

文章目录

  • 前言
  • 一、Ajax技术(从服务端获取数据,发送各种请求)
    • 0 接口文档管理:使用apipost等接口测试软件创建接口便于前端后端分离测试
    • 1 基本概念
    • 2 原生Ajax使用示例(几年前的早期用法)
  • 二、 Axios技术(对原生的Ajax进行了封装)
    • 1 基本概念
      • (1)Axios是什么
      • (2)常见的请求方式有哪些?
    • 2 快速入门
      • 示例1:入门案例
      • 示例2:入门案例+绑定事件
    • 3 Axios通用请求格式语法
      • 示例1:params传递参数发送get请求
      • 示例2:data传递参数发送post请求
      • 综合案例:地区查询
    • 4 axios 错误处理


前言

本课程所有接口采用apifox模拟,全部使用的是
B站-AJAX和黑马头条-数据管理平台
这个里面的接口进行测试


一、Ajax技术(从服务端获取数据,发送各种请求)

参考视频
官方文档

0 接口文档管理:使用apipost等接口测试软件创建接口便于前端后端分离测试

参考视频

  • 接口文档管理:
    • 在线
      • apipost
      • apifox
      • postman等等
    • 离线
      • word
      • md

在线的apipost这些测试工具功能很多,具体的后面不断深入学习慢慢了解这个测试工具,这个测试工具必须会用,后面无论是前端还是后端都需要频繁使用这个工具来进行测试。

下面的Ajax技术案例中的后端返回json数据都是通过这些接口工具的mock功能模拟生成的。

1 基本概念

学习本节前建议先去学习什么是GET、POST请求这些

  • 概念: Asynchronous JavaScript And XML,异步的JavaScript和XML。
    Ajax技术是一个异步交互技术,通过这个Ajax技术我们就可以从服务端获取数据
  • 作用:
    • 数据交换: 通过Ajax可以给服务器发送请求,并获取服务器响应的数据。
    • 异步交互: 可以在不重新加载整个页面的情况下,与服务器交换数据并更新部分网页的技术,如: 搜索联想、用户名是否可
      用的校验等等。
      在这里插入图片描述
  • 同步与异步请求区别
    • 举一个例子就好理解了
      我们在点击某些页面的时候,如果网络不好界面就会一直卡在转圈圈的界面,我们不能进行任何操作,这就是同步请求;如果我们点击某些页面就算网络不好我们还是可以操作页面,例如我们下载文件这个请求就是典型的异步请求。
  • Ajax技术就是一项发送异步请求的技术了。
    在这里插入图片描述

2 原生Ajax使用示例(几年前的早期用法)

  • 太繁琐,现在已经淘汰,了解一下
    可以使用网页版的apifox、或者apipost(个人感觉apifox更好用,界面更加清晰,apipost界面有点复杂,好多功能要摸索)生成一个get请求响应数据作为测试

  • 使用

    • (1)准备数据地址: http://hmajax.itheima.net/api/province
      示例接口文档:获取-省份列表
    • (2)创建XMLHttpRequest对象: 用于和服务器交换数据
    • (3)向服务器发送请求
    • (4)获取服务器响应数据

示例:

<body>
    <input type="button" value="获取数据" onclick = "getData()">
    <div id="div1"></div>
</body>

<script>
    function getData(){
        // 1 创建 XMLHttpRequest 对象
        var xmlHttpRequest = new XMLHttpRequest();

        // 2 发送异步请求
        xmlHttpRequest.open("GET","http://hmajax.itheima.net/api/province");
        xmlHttpRequest.send(); // 发送请求

        // 3 获取服务器响应的数据
        xmlHttpRequest.onreadystatechange = function(){
        if(xmlHttpRequest.readyState == 4 && xmlHttpRequest.status == 200){      // 判断服务器是否响应成功
            //var data = JSON.parse(xmlHttpRequest.responseText);
            document.getElementById("div1").innerHTML = xmlHttpRequest.responseText;
            // xmlHttpRequest.responseText :返回服务器响应的数据,以字符串形式返回
        }
        }

    }
    
</script>

查看结果:
在这里插入图片描述

  • 代码解释
    • 官方文档
      在这里插入图片描述

二、 Axios技术(对原生的Ajax进行了封装)

1 基本概念

(1)Axios是什么

参考视频

  • 介绍:Axios 对原生的Ajax进行了封装,简化书写,快速开发。
  • 官网(使用文档等): https://www.axios-http.cn/
    Axios 是一个基于 promise 的网络请求库,可以用于浏览器和 node.js

(2)常见的请求方式有哪些?

请求方法: 对服务器资源,要执行的操作
在这里插入图片描述

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

比较常用的就是get和post请求,其余的说实话post请求好像也都能干

2 快速入门

  • step1: 引入Axios的js文件
    <script src=“https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js”></script>

  • 使用 axios 函数发送请求,并获取响应结果
    (1)传入配置对象
    (2)再用 .then 回调函数接收结果,并做后续处理
    下面的语法,默认是get请求
    在这里插入图片描述

示例1:入门案例

参考视频

  • 需求: 请求目标资源地址,拿到省份列表数据,显示到页面
    在这里插入图片描述

  • 目标资源地址: http://hmajax.itheima.net/api/province
    接口文档说明

<body>
    <!--
      axios库地址:https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js
      省份数据地址:http://hmajax.itheima.net/api/province
  
      目标: 使用axios库, 获取省份列表数据, 展示到页面上
      1. 引入axios库
    -->
    <p class="my-p"></p>
    
  </body>

  <script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>
  <script>
    // 2. 使用axios函数
    axios({
      url: 'http://hmajax.itheima.net/api/province'
    }).then(result => {
      console.log(result)
      // 好习惯:多打印,确认属性名
      console.log(result.data.list)
      console.log(result.data.list.join('<br>'))
      // 把准备好省份列表,插入到页面
      document.querySelector('.my-p').innerHTML = result.data.list.join('<br>') 
    })
  </script>

结果:
在这里插入图片描述

示例2:入门案例+绑定事件

<body>
    <!--
      axios库地址:https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js
      省份数据地址:http://hmajax.itheima.net/api/province
  
      目标: 使用axios库, 获取省份列表数据, 展示到页面上
      1. 引入axios库
    -->
    <body>
      <input type="button" value="获取数据" onclick = "getData()">
      <div id="div1"></div>
    </body>
    
  </body>

  <script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>
  <script>
    function getData(){
        // 通过axios发送异步请求,默认是GET请求
        axios({
            url: "http://hmajax.itheima.net/api/province"
        }).then(result =>{
            document.getElementById("div1").innerHTML = result.data.list.join('<br>');
            // 通过 result.data 获取服务器返回的的JSON对象
        })
    }
  </script>

结果:
在这里插入图片描述

3 Axios通用请求格式语法

  • 通用请求格式语法
axios({
  method: 'post',        // 可以省略就是默认get请求, 大小写都可以 get\post\put\delete\patch
  url: '/user/123',      // 注意 参数传递的那部分要写写到params里面去
  data: { ... },         // 写到这个里面的数据会直接发送出去, 例如json、xml等结构化数据都可以在这个里面发送出去
  params: { ... },       // 写到这个里面的请求参数会拼接到 url 中发送出去  http://xxxx.com/xxx/xxx?参数名1=值1&参数名2=值2
});

一般地:

  • url中要传递参数数据就写到params里面去,get,post方法可以
  • data里面可以传任何参数,特别是文件上传、json、xml等结构化数据都通过这个传,所以POST/PUT 数据会比较多
  • 误区:params只能传递get数据、data只能传POST/PUT 数据(这个结合后端的接收请求接口就好理解了)
  • 除了url,method,data,params都是可选项,根据实际情况判断是否要不要

具体的怎么发送还是要看后端接口是怎么写的
@RequestBody :参数来源是请求体中的json等结构化数据
@RequestParam :参数来源可以是url或者请求体的表单数据
@RequestPart:用于上传文件,参数来源是请求体中的表单数据
@PathVariable:参数来源是url中的路径变量

示例1:params传递参数发送get请求

  • 语法: 使用 axios 提供的 params 选项
  • 注意: axios 在运行时把参数名和值,会拼接到 url?参数名=值
  • 城市列表: http://hmajax.itheima.net/api/city?pname=河北省
    在这里插入图片描述
    接口文档
<body>
  <!-- 
    城市列表: http://hmajax.itheima.net/api/city
    参数名: pname
    值: 省份名字
  -->
  <p></p>
  <script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>
  <script>
    axios({
      url: 'http://hmajax.itheima.net/api/city',
      // 查询参数
      params: {
        pname: '辽宁省'
      }
    }).then(result => {
      console.log(result.data.list)
      document.querySelector('p').innerHTML = result.data.list.join('<br>')
    })
  </script>
</body>

结果:
在这里插入图片描述

示例2:data传递参数发送post请求

参考视频

  • 需求:
    在这里插入图片描述
    接口文档
<body>
  <button class="btn">注册用户</button>
  <script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>
  <script>
    /*
      注册用户:http://hmajax.itheima.net/api/register
      请求方法:POST
      参数名:
        username:用户名(中英文和数字组成,最少8位)
        password:密码  (最少6位)

      目标:点击按钮,通过axios提交用户和密码,完成注册
    */
    document.querySelector('.btn').addEventListener('click', () => {
      axios({
        url: 'http://hmajax.itheima.net/api/register',
        method: 'POST',
        data: {
          username: 'hejuzs_01',    // 注意,重新注册用户名要修改,同样用户名不能注册两次
          password: 'hejuzs_01'
        }
      })
    })
  </script>
</body>

结果:
在这里插入图片描述

综合案例:地区查询

参考视频

  • 需求:在这里插入图片描述
    接口文档
<!DOCTYPE html>
<html lang="en">

<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 rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css"> -->
  <link rel="stylesheet" href="https://cdn.staticfile.org/twitter-bootstrap/4.3.1/css/bootstrap.min.css">
  <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">
      <!-- 示例地区 -->
      <li class="list-group-item">东城区</li>
    </ul>
  </div>
  <script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>
  <script>
    /*
      获取地区列表: http://hmajax.itheima.net/api/area
      查询参数:
        pname: 省份或直辖市名字
        cname: 城市名字
    */
   // 目标: 根据省份和城市名字, 查询地区列表
   // 1. 查询按钮-点击事件
   document.querySelector('.sel-btn').addEventListener('click', () => {
    // 2. 获取省份和城市名字
    let p_name = document.querySelector('.province').value
    let c_name = document.querySelector('.city').value

    // 3. 基于axios请求地区列表数据
    axios({
      url: 'http://hmajax.itheima.net/api/area',
      params: {
        pname:p_name,
        cname:c_name
      }
    }).then(result => {
      // console.log(result)
      // 4. 把数据转li标签插入到页面上
      let list = result.data.list
      console.log(list)
      let theLi = list.map(areaName => `<li class="list-group-item">${areaName}</li>`).join('')
      console.log(theLi)
      document.querySelector('.list-group').innerHTML = theLi
    })
   })


  </script>
</body>

</html>

结果:
在这里插入图片描述

4 axios 错误处理

参考视频

  • 语法:在 then 方法的后面,通过点语法调用 catch 方法,传入回调函数并定义形参
    在这里插入图片描述

  • 处理:注册案例,重发注册时通过弹框提示用户错误原因

  • 需求:
    在这里插入图片描述

<!DOCTYPE html>
<html lang="en">

<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>axios错误处理</title>
</head>

<body>
  <button class="btn">注册用户</button>
  <script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>
  <script>
    /*
      注册用户: http://hmajax.itheima.net/api/register
      请求方法: POST
      参数名:
        username: 用户名 (中英文和数字组成, 最少8位)
        password: 密码 (最少6位)

      目标: 点击按钮, 通过axios提交用户和密码, 完成注册
      需求: 使用axios错误处理语法, 拿到报错信息, 弹框反馈给用户
    */
   document.querySelector('.btn').addEventListener('click', () => {
    axios({
      url: 'http://hmajax.itheima.net/api/register',
      method: 'post',
      data: {
        username: 'hejuzs_01',
        password: 'hejuzs_01'
      }
    }).then(result => {
      // 成功
      console.log(result)
    }).catch(error => {      // error里面可以捕获到错误信息,如果后端的java接口抛出异常信息,返回了了一个状态码不正常的响应信息,那么就会进入到catch里面捕获到
      // 失败
      // 处理错误信息
      console.log(error)
      console.log(error.response.data.message)
      alert(error.response.data.message)
    })
   })
  </script>
</body>

</html>

结果:
在这里插入图片描述

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

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

相关文章

【赵渝强老师】Spark RDD的依赖关系和任务阶段

Spark RDD彼此之间会存在一定的依赖关系。依赖关系有两种不同的类型&#xff1a;窄依赖和宽依赖。 窄依赖&#xff1a;如果父RDD的每一个分区最多只被一个子RDD的分区使用&#xff0c;这样的依赖关系就是窄依赖&#xff1b;宽依赖&#xff1a;如果父RDD的每一个分区被多个子RD…

前缀和练习——洛谷P8218:求区间和

题目: 这道题很简单&#xff0c;直接根据题目无脑套公式 代码&#xff1a; #include<bits/stdc.h> using namespace std; const int N 1e5 9; using ll long long; ll a[N], perfix[N]; int main() {ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);//取消同步输…

Python----Python高级(并发编程:线程Thread,多线程,线程间通信,线程同步,线程池)

一、线程Thread 1.1、线程 线程&#xff08;Thread&#xff09;是操作系统能够进行运算调度的最小单位。它被包含在进程之中&#xff0c;是进程中的实际运作单位线程是程序执行的最小单位&#xff0c;而进程是操作系统分配资源的最小单位&#xff1b;一个进程由一个或多个线程…

八大排序算法细讲

目录 排序 概念 运用 常见排序算法 插入排序 直接插入排序 思想&#xff1a; 步骤&#xff08;排升序&#xff09;: 代码部分&#xff1a; 时间复杂度&#xff1a; 希尔排序 思路 步骤 gap的取法 代码部分&#xff1a; 时间复杂度&#xff1a; 选择排序 直接选…

鲜牛奶订购系统的设计与实现

&#x1f345;点赞收藏关注 → 添加文档最下方联系方式咨询本源代码、数据库&#x1f345; 本人在Java毕业设计领域有多年的经验&#xff0c;陆续会更新更多优质的Java实战项目希望你能有所收获&#xff0c;少走一些弯路。&#x1f345;关注我不迷路&#x1f345; 项目视频 基…

ESP32开发学习记录---》GPIO

she 2025年2月5日&#xff0c;新年后决定开始充电提升自己&#xff0c;故作此记,以前没有使用过IDF开发ESP32因此新年学习一下ESP32。 ESPIDF开发环境配置网上已经有很多的资料了&#xff0c;我就不再赘述&#xff0c;我这里只是对我的学习经历的一些记录。 首先学习一个…

智慧停车系统:不同规模停车场的应用差异与YunCitys解决方案

在智慧停车领域&#xff0c;不同规模停车场因自身特点&#xff0c;对智慧停车系统的需求和应用效果存在显著差异。云创智城凭借丰富的经验和先进的技术&#xff0c;为各类规模停车场打造了贴合需求的智慧停车系统&#xff0c;下面为您详细剖析。 小型停车场&#xff1a;精准高…

C++Primer逻辑和关系运算符

欢迎阅读我的 【CPrimer】专栏 专栏简介&#xff1a;本专栏主要面向C初学者&#xff0c;解释C的一些基本概念和基础语言特性&#xff0c;涉及C标准库的用法&#xff0c;面向对象特性&#xff0c;泛型特性高级用法。通过使用标准库中定义的抽象设施&#xff0c;使你更加适应高级…

VMware Win10下载安装教程(超详细)

《网络安全自学教程》 从MSDN下载系统镜像&#xff0c;使用 VMware Workstation 17 Pro 安装 Windows 10 consumer家庭版 和 VMware Tools。 Win10下载安装 1、下载镜像2、创建虚拟机3、安装操作系统4、配置系统5、安装VMware Tools 1、下载镜像 到MSDN https://msdn.itellyou…

Redis存储⑤Redis五大数据类型之 List 和 Set。

目录 1. List 列表 1.1 List 列表常见命令 1.2 阻塞版本命令 1.3 List命令总结和内部编码 1.4 List典型使用场景 1.4.1 消息队列 1.4.2 分频道的消息队列 1.4.3 微博 Timeline 2. Set 集合 2.1 Set 集合常见命令 2.2 Set 集合间命令 2.3 Set命令小结和内部编码 2.…

3-kafka服务端之控制器

文章目录 概述控制器的选举与故障恢复控制器的选举故障恢复 优雅关闭分区leader的选举 概述 在Kafka集群中会有一个或多个broker&#xff0c;其中有一个broker会被选举为控制器&#xff08;Kafka Controler&#xff09;&#xff0c;它负责管理整个集群中所有分区和副本的状态。…

e2studio开发RA2E1(5)----GPIO输入检测

e2studio开发RA2E1.5--GPIO输入检测 概述视频教学样品申请硬件准备参考程序源码下载新建工程工程模板保存工程路径芯片配置工程模板选择时钟设置GPIO口配置按键口配置按键口&Led配置R_IOPORT_PortRead()函数原型R_IOPORT_PinRead()函数原型代码 概述 本篇文章主要介绍如何…

[LeetCode]全排列I,II

全排列I 给定一个不含重复数字的整数数组 nums &#xff0c;返回其 所有可能的全排列 。可以 按任意顺序 返回答案。 示例 1&#xff1a; 输入&#xff1a;nums [1,2,3] 输出&#xff1a;[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]示例 2&#xff1a; 输入&#xff1…

Java 大视界 -- 深度洞察 Java 大数据安全多方计算的前沿趋势与应用革新(52)

&#x1f496;&#x1f496;&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎你们来到 青云交的博客&#xff01;能与你们在此邂逅&#xff0c;我满心欢喜&#xff0c;深感无比荣幸。在这个瞬息万变的时代&#xff0c;我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

Unity扩展编辑器使用整理(一)

准备工作 在Unity工程中新建Editor文件夹存放编辑器脚本&#xff0c; Unity中其他的特殊文件夹可以参考官方文档链接&#xff0c;如下&#xff1a; Unity - 手册&#xff1a;保留文件夹名称参考 (unity3d.com) 一、菜单栏扩展 1.增加顶部菜单栏选项 使用MenuItem&#xff…

如何查看:Buildroot所使用Linux的版本号、gcc交叉编译工具所使用的Linux的版本号、开发板上运行的Linux系统的版本号

定义编号①②③的含义 将“Buildroot所使用Linux的版本号”编号为① 将“gcc交叉编译工具所使用的Linux的版本号”编号为② 将“开发板上运行的Linux系统的版本号”编号为③ 查看①和②的共同方法(通过sysroot查看) 由于此二者都有目录sysroot&#xff0c;而通过目录sysroot…

html转PDF文件最完美的方案(wkhtmltopdf)

目录 需求 一、方案调研 二、wkhtmltopdf使用 如何使用 文档简要说明 三、后端服务 四、前端服务 往期回顾 需求 最近在做报表类的统计项目&#xff0c;其中有很多指标需要汇总&#xff0c;网页内容有大量的echart图表&#xff0c;做成一个网页去浏览&#xff0c;同时…

deepseek本地部署

DeepSeek本地部署详细指南 DeepSeek作为一款开源且性能强大的大语言模型&#xff0c;提供了灵活的本地部署方案&#xff0c;让用户能够在本地环境中高效运行模型&#xff0c;同时保护数据隐私&#xff0c;这里记录自己DeepSeek本地部署流程。 主机环境 cpu:amd 7500Fgpu:406…

【Reading Notes】Favorite Articles from 2025

文章目录 1、January2、February3、March4、April5、May6、June7、July8、August9、September10、October11、November12、December 1、January 极越之后&#xff0c;中国车市只会倒下更多人&#xff08;2025年01月01日&#xff09; 在这波枪林弹雨中&#xff0c;合资品牌中最…

配置@别名路径,把@/ 解析为 src/

路径解析配置 webpack 安装 craco npm i -D craco/craco 项目根目录下创建文件 craco.config.js &#xff0c;内容如下 const path require(path) module.exports {webpack: {// 配置别名alias: {// 约定&#xff1a; 使用 表示src文件所在路径: path.resolve(__dirname,src)…