后端工程师快速使用axios

news2024/11/16 0:42:48

文章目录

    • 01.AJAX 概念和 axios 使用
      • 模板
      • 目标
      • 讲解
      • 代码解析
      • 案例
        • 前端
        • 后端
        • 结果截图
    • 02.URL 查询参数
      • 模板
      • 目标
      • 讲解
      • 案例
        • 前端
        • 后端
        • 结果截图
    • 03.常用请求方法和数据提交
      • 模板
      • 目标
      • 讲解
      • 案例
        • 前端
        • 后端
        • 结果截图
    • 04.axios 错误处理
      • 模板
      • 目标
      • 讲解
      • 案例
        • 前端
        • 后端
        • 结果截图

01.AJAX 概念和 axios 使用

模板

axios({
  url: '目标资源地址'
}).then((result) => {
  // 对服务器返回的数据做后续处理
})

注:url中的地址可以直接使用相对路径,不必写完整的IP或域名

例如:

url: ‘localhost:8080/test3’ 可以写成 url: ‘/test3’

目标

了解 AJAX 概念并掌握 axios 库基本使用

讲解

  1. 什么是 AJAX ? mdn

    • 使用浏览器的 XMLHttpRequest 对象 与服务器通信

    • 浏览器网页中,使用 AJAX技术(XHR对象)发起获取省份列表数据的请求,服务器代码响应准备好的省份列表数据给前端,前端拿到数据数组以后,展示到网页

      image-20230403173156484

  2. 什么是服务器?

    • 可以暂时理解为提供数据的一台电脑
  3. 为何学 AJAX ?

    • 以前我们的数据都是写在代码里固定的, 无法随时变化
    • 现在我们的数据可以从服务器上进行获取,让数据变活
  4. 怎么学 AJAX ?

    • 这里使用一个第三方库叫 axios, 后续在学习 XMLHttpRequest 对象了解 AJAX 底层原理
    • 因为 axios 库语法简单,让我们有更多精力关注在与服务器通信上,而且后续 Vue,React 学习中,也使用 axios 库与服务器通信
  5. 需求:从服务器获取省份列表数据,展示到页面上(体验 axios 语法的使用)

    获取省份列表数据 - 目标资源地址:http://hmajax.itheima.net/api/province

    • 完成效果:

      image-20230220113157010

  6. 接下来讲解 axios 语法,步骤:

  7. 引入 axios.js 文件到自己的网页中

    axios.js文件链接: https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js

  8. 明确axios函数的使用语法

    注意:请求的 url 地址, 就是标记资源的网址

    注意:then 方法这里先体验使用,由来后续会讲到

  9. 对应代码

<!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>AJAX概念和axios使用</title>
</head>

<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>
  <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>
</body>

</html>

代码解析

  1. document.querySelector('.my-p'): 这一部分使用了 querySelector 方法来获取文档中具有 classmy-p 的第一个元素。querySelector 方法返回匹配到的第一个元素,如果没有找到匹配的元素,则返回 null
  2. .innerHTML: 这是一个 DOM 元素的属性,用于获取或设置元素的 HTML 内容。在这里,它被用于设置元素的 HTML 内容。
  3. result.data.list.join('<br>'): 这部分使用了 join 方法,将 result.data.list 数组中的每个元素用 <br> 连接起来成为一个字符串。join 方法会将数组的元素以指定的分隔符连接起来。在这里,分隔符是 <br>,表示换行。

案例

前端
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>
<script>
    axios({
        url: 'http://localhost:8080/test'
    }).then(result => {
        console.log(result)
        console.log(result.data.data)
        console.log(result.data.data.join('<br>'))
        // document.querySelector('.my-p').innerHTML=result.data.list.join('<br>')
        var divs = document.getElementsByClassName('my-p');
        var div1=divs[0];

        div1.innerHTML=result.data.data.join('<br>')
    });
</script>
<p class="my-p"></p>
</body>
</html>
后端
package nuage.controller;

import nuage.common.R;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.ArrayList;
import java.util.List;

@RestController
@RequestMapping
public class TestController {

    @GetMapping("/test")
    public R<List<String>> test() {
        List<String> list = new ArrayList<>();
        list.add("a");
        list.add("b");
        list.add("c");
        return R.success(list);
    }
}

结果截图

image-20240315111242951

02.URL 查询参数

模板

axios({
  url: '目标资源地址',
  params: {
    参数名:}
}).then(result => {
  // 对服务器返回的数据做后续处理
})

目标

掌握-通过URL传递查询参数,获取匹配的数据

讲解

  1. 什么是查询参数 ?

    • 携带给服务器额外信息,让服务器返回我想要的某一部分数据而不是全部数据

    • 举例:查询河北省下属的城市列表,需要先把河北省传递给服务器

      image-20230404101257205

  2. 查询参数的语法 ?

    • 在 url 网址后面用?拼接格式:http://xxxx.com/xxx/xxx?参数名1=值1&参数名2=值2
    • 参数名一般是后端规定的,值前端看情况传递即可
  3. axios 如何携带查询参数?

    • 使用 params 选项即可

      查询城市列表的 url地址:http://hmajax.itheima.net/api/city

      参数名:pname (值要携带省份名字)

  4. 需求:获取“河北省”下属的城市列表,展示到页面,对应代码:

    <!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>
    </head>
    <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>
    </html>
    

案例

前端
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>
<script>

    axios({
        url: 'http://localhost:8080/test2',
        params: {
            name: '河北省'
        }
    }).then(result => {
        console.log(result);
        var list = document.getElementsByClassName("my-p");
        var list1 = list[0];
        list1.innerHTML=result.data.data.join('<br>')
    });

</script>
<p class="my-p"></p>
</body>
</html>
后端
package nuage.controller;

import nuage.common.R;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.ArrayList;
import java.util.List;

@RestController
@RequestMapping
public class TestController {

    @GetMapping("/test2")
    public R<List<String>> test2(String name) {
        List<String> list = new ArrayList<>();
        list.add(name);
        list.add("a");
        list.add("b");
        list.add("c");
        return R.success(list);
    }
}

结果截图

image-20240315111750353

03.常用请求方法和数据提交

模板

axios({
  url: '目标资源地址',
  method: '请求方法',
  data: {
    参数名:}
}).then(result => {
  // 对服务器返回的数据做后续处理
})

目标

掌握如何向服务器提交数据,而不单单是获取数据

讲解

  1. 想要提交数据,先来了解什么是请求方法

    • 请求方法是一些固定单词的英文,例如:GET,POST,PUT,DELETE,PATCH(这些都是http协议规定的),每个单词对应一种对服务器资源要执行的操作

    • 前面我们获取数据其实用的就是GET请求方法,但是axios内部设置了默认请求方法就是GET,我们就没有写

    • 但是提交数据需要使用POST请求方法

      请求方法操作
      GET获取数据
      POST数据提交
      PUT修改数据(全部)
      DELETE删除数据
      PATCH修改数据(部分)
  2. 什么时候进行数据提交呢?

    • 例如:多端要查看同一份订单数据,或者使用同一个账号进行登录,那订单/用户名+密码,就需要保存在服务器上,随时随地进行访问

      image-20230404104328384

      image-20230404104333584

    3.需求:注册账号,提交用户名和密码到服务器保存

    注册用户 URL 网址:http://hmajax.itheima.net/api/register

    请求方法:POST

    参数名:

    username:用户名(要求中英文和数字组成,最少8位)

    password:密码(最少6位)

    image-20230404104350387

    4.正确代码如下:

    /*
      注册用户: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: 'itheima007',
          password: '7654321'
        }
      })
    })
    

    注:PUT和DELETE与POST类似,只需要将method改为PUT或DELETE即可

    实现路径参数,只需要在url后面拼接字符串即可,如:url: '/user/delet/' + row.id,row.id根据上下文查询

案例

前端
<!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>
</head>

<body>
  <script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>
  <script>

    function dianji() {
      // console.log(123)
      var username = document.getElementsByClassName("username")[0].value;
      var password = document.getElementsByClassName("password")[0].value;
      console.log(username);
      axios({
        url: 'http://localhost:8080/test3',
        method: 'POST',
        data: {
          username: username,
          password: password
        }
      }).then(result=>{
        console.log(result.data);
        alert(result.data.data)
      })
    }


  </script>
用户名:<input class="username" type="text" >
  <br>
密码:<input class="password" type="password">
  <br>
<button class="bt" onclick="dianji()">注册</button>
</body>

</html>
后端
package nuage.controller;

import nuage.common.R;
import nuage.entity.User;
import org.springframework.web.bind.annotation.*;

import java.util.ArrayList;
import java.util.List;

@RestController
@RequestMapping
public class TestController {

    @PostMapping("/test3")
    public R<String> test3(@RequestBody User user) {
        System.out.println(user);
        return R.success("注册成功");
    }
}

package nuage.entity;

public class User {
    private String username;
    private String password;
	//get和set方法自己补充
}

结果截图

image-20240315164558128

04.axios 错误处理

模板

axios({
  // ...请求选项
}).then(result => {
  // 处理成功数据
}).catch(error => {
  // 处理失败错误
})

目标

掌握接收 axios 响应错误信息的处理语法

讲解

  1. 如果注册相同的用户名,则会遇到注册失败的请求,也就是 axios 请求响应失败了,你会在控制台看到如图的错误:

    image-20230220131753051

  2. 在 axios 语法中要如何处理呢?

    • 因为,普通用户不会去控制台里看错误信息,我们要编写代码拿到错误并展示给用户在页面上
  3. 需求:再次重复注册相同用户名,提示用户注册失败的原因

    image-20230404104440224

    image-20230404104447501

  4. 对应代码

    document.querySelector('.btn').addEventListener('click', () => {
        axios({
          url: 'http://hmajax.itheima.net/api/register',
          method: 'post',
          data: {
            username: 'itheima007',
            password: '7654321'
          }
        }).then(result => {
          // 成功
          console.log(result)
        }).catch(error => {
          // 失败
          // 处理错误信息
          console.log(error)
          console.log(error.response.data.message)
          alert(error.response.data.message)
        })
    })
    

案例

因为项目中我们的错误信息也是返回正确的状态码,所以不能写在.catch中,我们可以根据后端传过来的code来进行判断

前端
<!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>
</head>

<body>
  <script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>
  <script>

    function dianji() {
      // console.log(123)
      var username = document.getElementsByClassName("username")[0].value;
      var password = document.getElementsByClassName("password")[0].value;
      console.log(username);
      axios({
        url: 'http://localhost:8080/test3',
        method: 'POST',
        data: {
          username: username,
          password: password
        }
      }).then(result => {

        if (result.data.code === 1) {
          console.log(result);
          alert(result.data.data)
        }else if (result.data.code === 0) {
          console.log(result);
          alert(result.data.msg)
        }
      }).catch(error => {

      });
    }


  </script>
用户名:<input class="username" type="text" >
  <br>
密码:<input class="password" type="password">
  <br>
<button class="bt" onclick="dianji()">注册</button>
</body>

</html>
后端
package nuage.controller;

import nuage.common.R;
import nuage.entity.User;
import org.springframework.web.bind.annotation.*;

import java.util.ArrayList;
import java.util.List;

@RestController
@RequestMapping
public class TestController {

    @PostMapping("/test3")
    public R<String> test3(@RequestBody User user) {
        if (user.getUsername().equals("nuage")) {
            return R.error("注册失败");
        }
        System.out.println(user);
        return R.success("注册成功");
    }
}

结果截图

image-20240315173307346

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

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

相关文章

手写简易操作系统(十)--中断概述

前情提要 我们还是总结一下前面做了什么 1、计算机启动&#xff0c;BIOS将MBR导入到内存&#xff0c;并跳转到相应位置执行 2、MBR将Loader导入到内存&#xff0c;并跳转执行 3、Loader中开启保护模式&#xff0c;准备好GDT表&#xff0c;开启内存分页&#xff0c;从此之后…

07|链(下):想学“育花”还是“插花”用RouterChain确定客户意图

任务设定 鲜花养护&#xff08;保持花的健康、如何浇水、施肥等&#xff09;鲜花装饰&#xff08;如何搭配花、如何装饰场地等&#xff09; 如果接到的是第一类问题&#xff0c;你要给ChatBot A指示&#xff1b;如果接到第二类的问题&#xff0c;你要给ChatBot B指示。 整体…

Window部署AgileConfig

AgileConfig&#xff1a;分布式配置中心 github&#xff1a;GitHub - dotnetcore/AgileConfig: 基于.NET Core开发的轻量级分布式配置中心 / .NET Core lightweight configuration server 下载部署包&#xff1a;Releases dotnetcore/AgileConfig GitHub 版本&#xff1a;…

MateBook D 14 SE版(2022版)使用体验

试用了一下华为的笔记本电脑&#xff0c;我觉得是出乎意料的好用&#xff0c;配置不算高&#xff0c;但是特别流程&#xff0c;而且自带了正版的office等软件&#xff0c;生产力杠杠的&#xff0c;外观也很不错&#xff0c;设计语言很高级&#xff0c;价格不贵&#xff0c;但是…

QGIS中天地图插件的安装与使用

概述 在QGIS中可添加xyz类型的切片为数据源&#xff0c;一般作为底图加载到地图上。在QGIS中添加xyz类型的切片的操作可参考QGIS CookBook。天地图提供的服务也是xyz类型的切片&#xff0c;但是为提高其加载速度&#xff0c;一般采用了t0-t7多个节点&#xff0c;在QGIS中添加x…

rocky9 编写一键安装mysql 的sh脚本

基本操作步骤 1、虚拟机最小化安装rocky9系统&#xff0c;安装后克隆一个系统&#xff1b;1个用来获取下载的rpm包&#xff0c;一个用来编写sh 测试脚本&#xff1b; 2、修改虚拟机的 yum配置文件&#xff0c;获取获取rpm程序 &#xff1a;启用缓存&#xff0c;并修改yum下载…

高效使用git流程分享

准备 假设你已经 clone 了当前仓库&#xff0c;并且你的终端位置已经位于仓库目录中。 查询状态 查询状态常用的命令有 git status 和 git branch。 前者用于查询更改文件情况&#xff0c;后者用于展示所有分支。 chatbot-system$ git status On branch develop Your bran…

RedisCluster集群中的插槽为什么是16384个?

RedisCluster集群中的插槽为什么是16384个&#xff1f; CRC16的算法原理。 1.根据CRC16的标准选择初值CRCIn的值2.将数据的第一个字节与CRCIn高8位异或3.判断最高位&#xff0c;若该位为0左移一位&#xff0c;若为1左移一位再与多项式Hex码异或4.重复3至9位全部移位计算结束5…

PHP姓名快速匿名化工具(重组脱敏)

PHP姓名重组工具(脱敏/匿名化工具) 将excel数据姓名列粘贴提交&#xff0c;得到随机姓随机中间字随机尾字的重组姓名 那些年自用瞎搞的代码&#xff0c;今日整理成网页交提交得到结果的交互功能分享。 <?php //PHP姓名重组工具(脱敏/匿名化工具) //将excel数据姓名列粘贴…

前端面试拼图-知识广度

摘要&#xff1a;最近&#xff0c;看了下慕课2周刷完n道面试题&#xff0c;记录并添加部分可参考的文档&#xff0c;如下... 1. 移动端H5 click有300ms延迟&#xff0c; 如何解决&#xff1f; 背景&#xff1a;double tap to zoom 移动端H5中的300ms点击延迟问题通常是由浏览…

Obsidian使用200+插件与70+种主题分享

主题资源 下载方式一&#xff1a; 网盘下载 密码:a3eu 下载方式二&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1fOgP8lY29sYxkUAbTlQQCw 提取码&#xff1a;qhxa 下载解压打开红色框文件夹 上面的是插件&#xff0c;下面的是主题 以下介绍安装主题 打开Obsidi…

定义一个符号常量,并计算

这段代码的输出结果是什么 #include <stdio.h> #define PI 32 int main() { int iPI*2; printf("i%d\n",i);} 是7。 我问了一下AI&#xff0c;AI也回答错了&#xff0c;这是个值得注意的地方。

华为鸿蒙生态杀疯了 大厂高薪急聘鸿蒙开发者

前言 最近有接收到个别小伙伴的疑惑&#xff0c;说鸿蒙现在前景不好就业又困难&#xff0c;为什么我偏偏选择了他呢&#xff1f; 但其实真正了解鸿蒙前景的小伙伴都知道&#xff0c;鸿蒙系统强势来袭&#xff0c;华为“纯血鸿蒙”技术开发人员急缺&#xff0c;薪资待遇极好&a…

云原生(四)、Docker-Compose

Docker-Compose Docker Compose 是一个用于定义和运行多容器 Docker 应用程序的工具。它使用一个简单的 YAML 文件来配置应用程序的服务、网络和卷&#xff0c;从而使得在不同环境中轻松部署应用程序变得更加简单和可靠。 Docker Compose 主要由以下几个核心组件组成&#xf…

DockerHub搜索并拉取一个Redis镜像

1&#xff09;去DockerHub搜索Redis镜像 2&#xff09;查看Redis镜像的名称和版本 3&#xff09;利用docker pull命令拉取镜像 4&#xff09;利用docker save命令将 redis:latest打包为一个redis.tar包 5&#xff09;利用docker rmi 删除本地的redis:latest 6&#xff09;利用…

小鹏MONA将至:10 - 15万级,用性价比打新势力,用智驾打比亚迪

‍ 作者 |老缅 编辑 |德新 小鹏的全新品牌即将发布&#xff0c;10-15万级也能有高等级智能驾驶。 3月16日在中国电动汽车百人会论坛2024上&#xff0c;小鹏汽车董事长、CEO何小鹏提出&#xff1a;“下一个十年将是智能化的十年。未来18个月内高阶智驾的拐点将到来”。 所谓…

Git——GitHub远端协作详解

目录 Git&GitHub1、将内容Push到GitHub上1.1、在GitHub上创建新项目1.2、upstream1.3、如果不想要相同的分支名称 2、Pull下载更新2.1、Fetch指令2.2、Fetch原理2.3、Pull指令2.4、PullRebase 3、为什么有时候推不上去3.1、问题复现3.2、解决方案一&#xff1a;先拉再推3.3…

深度学习神经网络相关记录《二》

如何判断模型是一个好模型&#xff1f; 模型预测效果&#xff0c;也就是模型预测的准确率运算速度&#xff1b;能够处理大量数据、短时间内急速学习、可以实时进行预测&#xff0c;是机器学习的重要优势&#xff1b;可解释性&#xff1b;深度学习已经不太关系这一点了&#xf…

面试算法-51-翻转二叉树

题目 给你一棵二叉树的根节点 root &#xff0c;翻转这棵二叉树&#xff0c;并返回其根节点。 示例 1&#xff1a; 输入&#xff1a;root [4,2,7,1,3,6,9] 输出&#xff1a;[4,7,2,9,6,3,1] 解 class Solution {public TreeNode invertTree(TreeNode root) {dfs(root);re…

苍穹外卖-day09:用户端历史订单模块(理解业务逻辑),商家端订单管理模块(理解业务逻辑),校验收货地址是否超出配送范围(相关API)

用户端历史订单模块 1. 查询历史订单&#xff08;分页查询&#xff09; 1.1 需求分析和设计 产品原型&#xff1a; 业务规则 分页查询历史订单可以根据订单状态查询展示订单数据时&#xff0c;需要展示的数据包括&#xff1a;下单时间、订单状态、订单金额、订单明细&#…