以JavaScript的学习角度看Axios,并以spring boot+vue3为例具体分析实现

news2024/11/23 4:16:06

什么是Axios

Axios 是一个基于 Promise 的 HTTP 客户端,用于在浏览器和 后端 中发送异步的 HTTP 请求。它功能强大、易用,常用于与 API 交互,发送 GET、POST、PUT、DELETE 等请求。

Axios 的主要特点:

  1. 支持 Promise
    Axios 基于 Promise,能够很好地与现代 JavaScript 异步编程模式结合使用,例如使用 async/await,简化了异步代码的编写。

  2. 请求和响应的拦截器
    通过使用拦截器,开发者可以在请求发出前或响应返回后对数据进行处理,这使得在请求发送前进行一些处理或对返回结果进行统一的预处理变得更容易。

  3. 自动转换 JSON 数据
    Axios 会自动将响应中的 JSON 数据转换为 JavaScript 对象,这使得处理数据变得简单。

  4. 浏览器支持防止 CSRF
    在浏览器环境中,Axios 自动为跨站请求伪造(CSRF)防护提供默认支持,这使得它在处理安全性时非常有用。

  5. 客户端支持取消请求
    通过 CancelToken,你可以随时取消正在进行的请求,以节省资源或优化用户体验。

  6. 支持超时和防止重复请求
    Axios 支持为请求设置超时,并且可以轻松处理需要避免重复发送请求的场景。

  7. 在 Node.js 中支持流
    在 Node.js 环境中,Axios 支持与文件流进行交互,这在处理大文件下载或上传时非常方便。

关于promise,可以移步看我这篇帖子:

https://blog.csdn.net/qq_55018264/article/details/142874115

Axios的基础使用

Axios 基于 Promise,意味着你可以像处理 Promise 一样使用它的 then() 和 catch() 方法。then() 用于处理成功的请求,catch() 用于处理失败的请求

基本的 GET 请求示例:

const axios = require('axios');

// 发送 GET 请求
axios.get('https://api.example.com/data')
  .then(response => {
    console.log(response.data);
  })
  .catch(error => {
    console.error('Error:', error);
  });

POST 请求的例子:

axios.post('https://api.example.com/data', {
    username: 'test',
    password: '1234'
  })
  .then(response => {
    console.log(response.data);
  })
  .catch(error => {
    console.error('Error:', error);
  });

也可以使用 async/await,它是 Promise 的简化语法:

async function fetchData() {
  try {
    const response = await axios.get('/api/data');
    console.log(response.data);
  } catch (error) {
    console.error(error);
  }
}

以spring boot+vue3为例学习使用(简易版)

代码(便于读者测试):

实体类 Article

package com.accumulation.pojo;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Article {
    private int id; // 新增 id 属性
    private String title;
    private String category;
    private String time;
    private String state;
}

控制器 TodoController
package com.accumulation.controller;

import com.accumulation.pojo.Article;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.web.bind.annotation.*;

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

@RestController
@RequestMapping("/article")
@CrossOrigin//支持跨域
public class ArticleController {

    private List<Article> articleList = new ArrayList<>();

    {
        articleList.add(new Article(1,"特斯拉市值一夜蒸发超4700亿", "时事", "2024-10-10", "已发布"));
        articleList.add(new Article(2,"中国男足为何在澳大利亚一败涂地", "足球", "2024-10-11", "草稿"));
        articleList.add(new Article(3,"博物馆文创为何让年轻人着迷", "旅游", "2024-10-10", "已发布"));
    }

    //新增文章
    @PostMapping("/add")
    public String add(@RequestBody Article article) {
        articleList.add(article);
        return "新增成功";
    }

    //获取所有文章信息
    @GetMapping("/getAll")
    public List<Article> getAll(HttpServletResponse response) {
        return articleList;
    }

    //根据文章分类和发布状态搜索
    @GetMapping("/search")
    public List<Article> search(@RequestParam(required = false) String category, @RequestParam(required = false) String state) {
        return articleList.stream().filter(article -> {
            boolean matchesCategory = (category == null || category.isEmpty() || article.getCategory().contains(category));
            boolean matchesState = (state == null || state.isEmpty() || article.getState().contains(state));
            return matchesCategory && matchesState;
        }).collect(Collectors.toList());
    }


    // 根据ID删除文章
    @GetMapping("/del")
    public String del(@RequestParam int id) {
        articleList.removeIf(a -> a.getId() == id); // 根据 ID 删除文章
        return "删除成功";
    }

    // 更新文章标题
    @PostMapping("/update")
    public String update(@RequestBody Article article) {
        for (int i = 0; i < articleList.size(); i++) {
            if (articleList.get(i).getId() == article.getId()) {
                articleList.get(i).setTitle(article.getTitle()); // 更新标题
                break;
            }
        }
        return "更新成功";
    }
}

Vue 组件
<!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 id="app">
        文章分类: <input type="text" v-model="searchConditions.category">
        发布状态: <input type="text" v-model="searchConditions.state">
        <button v-on:click="search">搜索</button>
        <br />
        <br />

        <!-- 文章列表 -->
        <table border="1 solid" colspa="0" cellspacing="0">
            <tr>
                <th>文章标题</th>
                <th>分类</th>
                <th>发表时间</th>
                <th>状态</th>
                <th>操作</th>
            </tr>
            <tr v-for="(article, index) in articleList" :key="article.id">
                <td>{{ article.title }}</td>
                <td>{{ article.category }}</td>
                <td>{{ article.time }}</td>
                <td>{{ article.state }}</td>
                <td>
                    <button v-on:click="edit(index)">编辑</button>
                    <button v-on:click="del(index)">删除</button>
                </td>
            </tr>
        </table>

        <!-- 编辑文章模态框 -->
        <div v-if="isEditing" class="modal">
            <h2>编辑文章</h2>
            <label>标题:</label>
            <input type="text" v-model="currentArticle.title">
            <br />
            <button v-on:click="updateArticle">保存</button>
            <button v-on:click="cancelEdit">取消</button>
        </div>
    </div>

    <!-- 导入axios的js文件 -->
    <script src="https://unpkg.com/axios/dist/axios.min.js"></script>
    <script type="module">
        // 导入vue模块
        import { createApp } from 'https://unpkg.com/vue@3/dist/vue.esm-browser.js';

        // 创建vue应用实例
        createApp({
            data() {
                return {
                    articleList: [],
                    searchConditions: {
                        category: '',
                        state: ''
                    },
                    isEditing: false, // 控制模态框的显示与隐藏
                    currentArticle: {} // 当前编辑的文章
                }
            },
            methods: {
                search: function() {
                    //发送请求,完成搜索,携带搜索条件
                    axios.get('http://localhost:8080/article/search', {
                        params: {
                            category: this.searchConditions.category,
                            state: this.searchConditions.state
                        }
                    })
                    .then(result => {
                        //成功回调 result.data
                        //把得到的数据赋值给articleList
                        this.articleList = result.data;
                    })
                    .catch(err => {
                        console.log(err);
                    });
                },
                edit(index) {
                    // 获取当前编辑的文章
                    this.currentArticle = { ...this.articleList[index] }; // 复制当前文章数据
                    this.isEditing = true; // 显示编辑模态框
                },
                del(index) {
                    const article = this.articleList[index];
                    axios.get('http://localhost:8080/article/del?id=' + article.id)
                        .then(result => {
                            console.log(result.data);
                            this.refreshArticles();
                        }).catch(err => {
                            console.log(err);
                        });
                },
                updateArticle() {
                    // 发送更新请求
                    axios.post('http://localhost:8080/article/update', this.currentArticle)
                        .then(result => {
                            console.log(result.data); // 打印更新成功的消息
                            this.refreshArticles(); // 刷新文章列表
                            this.cancelEdit(); // 关闭模态框
                        }).catch(err => {
                            console.log(err);
                        });
                },
                cancelEdit() {
                    this.isEditing = false; // 隐藏编辑模态框
                    this.currentArticle = {}; // 清空当前文章
                },
                refreshArticles() {
                    axios.get('http://localhost:8080/article/getAll')
                        .then(result => {
                            this.articleList = result.data;
                        }).catch(err => {
                            console.log(err);
                        });
                }
            },
            mounted() {
                this.refreshArticles(); // 初始化时获取所有文章数据
            }
        }).mount('#app');
    </script>
</body>


</html>

实现情况(搜索、编辑、删除)

在这里插入图片描述

前后端分析:

后端(Spring Boot):

@RestController:标识该类为 RESTful 控制器,返回的对象会自动序列化为 JSON 格式。
@RequestMapping(“/article”):定义请求的基础路径。
@CrossOrigin:允许跨域请求,这对于前后端分离的应用非常重要。
@RequestBody 注解将请求体中的 JSON 数据映射到 Article 对象。
后端的 Spring Boot 应用会接收到来自前端的请求。根据请求的 URL,Spring 会调用相应的处理方法。
对于获取所有文章的请求,调用 getAll() 方法,返回 articleList
返回的数据会被 Spring 自动转换为 JSON 格式并发送回前端。

前端(Vue 3 + Axios):

data() 中定义了 articleList 和 searchConditions。
search 方法通过 Axios 发送 GET 请求以获取符合条件的文章,并将结果赋值给 articleList。这个请求会向后端发送一个带有查询参数的 HTTP GET 请求,获取符合条件的文章数据。
mounted 钩子函数在组件加载时获取所有文章数据,发送 GET 请求以获取所有文章数据,这个请求会触发浏览器向后端服务器发送一个 HTTP GET 请求,要求获取所有文章的信息

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

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

相关文章

【数据结构笔记】搜索树

二叉搜索树 任一节点x的左/右子树中&#xff0c;所有非空节点均不大于&#xff08;不小于&#xff09;x 必须是所有的非空节点&#xff0c;仅左右孩子不够&#xff08;左孩子的右孩子可能很大&#xff09;一棵二叉树是二叉搜索树当且仅当中序遍历序列是单调非降序列 两棵二叉…

在电脑上免费压缩视频的 16 个视频压缩软件

正在寻找适用于 Windows 或 Mac 的最佳视频压缩器&#xff0c;让您轻松压缩 MP4、AVI、MKV、MOV 和更多类型的文件&#xff1f;无论您是通过社交媒体与朋友分享视频录制、释放手机空间&#xff0c;还是通过邮件发送长 MP4 视频&#xff0c;都必须使用付费或免费视频压缩软件来压…

2013年国赛高教杯数学建模D题公共自行车服务系统解题全过程文档及程序

2013年国赛高教杯数学建模 D题 公共自行车服务系统 公共自行车作为一种低碳、环保、节能、健康的出行方式&#xff0c;正在全国许多城市迅速推广与普及。在公共自行车服务系统中&#xff0c;自行车租赁的站点位置及各站点自行车锁桩和自行车数量的配置&#xff0c;对系统的运行…

提升邮件营销设计精准度秘诀,效率与效果实践

邮件营销通过确定目标群体、数据分析、邮件设计、测试优化、保持频率时效性及结合其他渠道实现精准营销&#xff0c;提高市场效益。ZohoCampaigns集成CRM、自动化功能和客户细分提升效果。 1、确定目标群体 精准营销的第一步是了解并确定你的目标群体。标定目标群体包括年龄、…

SpringSecirity(四)——用户退出

因为JWT是无状态的&#xff0c;去中心化的&#xff0c;在服务器端无法清除&#xff0c;服务器一旦进行颁发&#xff0c;就只能等待自动过期 才会失效&#xff0c;所以需要redis配合才能完成登录状态的记录。 实现思路&#xff1a; 登录后在redis中添加一个白名单&#xff0c;把…

信息系统运维管理方案,运维建设文档,运维平台建设方案,软件硬件中间件运维方案,信息安全管理(原件word,PPT,excel)

建设方案目录&#xff1a; 1、智慧运维系统建设背景 2、智慧运维系统建设目标 3、智慧运维系统建设内容 4、智慧运维系统建设技术 5、智慧运维系统建设流程 6、智慧运维系统建设收益 企业对运维管理的需求&#xff1a; 1、提高运维效率&#xff1a;降低运维成本&#xff0c;提高…

威纶通触摸屏与三菱FX5u之间 EtherNet/IP无线以太网通信方案

在实际系统中&#xff0c;同一个车间里分布多台PLC&#xff0c;由触摸屏集中控制。通常所有设备距离在几十米到上百米不等。在有通讯需求的时候&#xff0c;如果布线的话&#xff0c;工程量较大且不美观&#xff0c;这种情况下比较适合采用无线通信方式。本方案以威纶通触摸屏和…

Python数据分析-Scipy科学计算法

1.认识Scipy SciPy&#xff08;发音为 "Sigh Pie"&#xff09;是一个开源的 Python 算法库和数学工具包。 通常与 NumPy、Matplotlib 和 pandas 等库一起使用&#xff0c;这些库共同构成了 Python 的科学计算基础。 2.使用Scipy基本函数 2.1 引用Scipy函数 impor…

vue+echarts实现雷达图及刻度标注

文章目录 前言代码实现实现效果总结 前言 最近项目有做数据可视化 大屏 不免再次使用些echarts应用 记录下其中echarts雷达图的实现 代码实现 先上代码 <template><div class"container"><div ref"chart" style"width: 500px; heig…

【Spring AI】Java实现类似langchain的向量数据库RAG_原理与具体实践

介绍一下RAG&#xff1a; 检索增强生成&#xff08;RAG&#xff09;是一种技术&#xff0c;它结合了检索模型和生成模型来提高文本生成的质量。通过从企业私有或专有的数据源中检索相关信息&#xff0c;并将这些信息与大型语言模型相结合&#xff0c;RAG能够显著减少模型产生幻…

如何建立高质量的谷歌外链?

想做谷歌seo&#xff0c;外链是绝对绕不开的一个门槛&#xff0c;外链对网站的流量和SEO表现有很大帮助&#xff0c;正常途径想建立高质量外链需要策略和技巧&#xff0c;内容平台和博客是获取外链的好地方。在这些平台上发布文章并嵌入外链&#xff0c;不仅可以展示你的专业能…

删除链表的倒数第 N 个结点 | LeetCode-19 | 双指针 | 递归 | 栈 | 四种方法

&#x1f64b;大家好&#xff01;我是毛毛张! &#x1f308;个人首页&#xff1a; 神马都会亿点点的毛毛张 这道题还可以用递归法&#xff0c;你想到了吗&#xff1f;毛毛张介绍四种方法 LeetCode链接&#xff1a;19. 删除链表的倒数第 N 个结点 1.题目描述 给你一个链表&a…

《Linux从小白到高手》综合应用篇:深入理解Linux进程调优

本篇深入介绍Linux进程调优. 1. Linux系统进程类型&#xff1a; Linux的进程可能有成千上万个&#xff1a; ‌新建状态‌&#xff1a;进程刚刚被创建&#xff0c;但尚未运行。 ‌就绪状态‌&#xff1a;进程已经准备好运行&#xff0c;等待CPU分配。 ‌运行状态‌&#xff1…

解读 AI 获客关键要素,开启营销新未来

​在当今数字化浪潮席卷的时代&#xff0c;企业获客的难度与日俱增&#xff0c;传统方式逐渐力不从心。而 AI 获客宛如一颗璀璨的新星&#xff0c;为企业带来全新的机遇。 AI 获客凭借人工智能强大的数据分析能力&#xff0c;能从海量数据中精准挖掘出目标客户。其优势显著&…

C语言题目练习2

前面我们知道了单链表的结构及其一些数据操作&#xff0c;今天我们来看看有关于单链表的题目~ 移除链表元素 移除链表元素&#xff1a; https://leetcode.cn/problems/remove-linked-list-elements/description/ 这个题目要求我们删除链表中是指定数据的结点&#xff0c;最终返…

虹科应用 | 15分钟部署CAN记录仪,节省95%成本的秘诀是什么?

欢迎关注虹科&#xff0c;为您提供最新资讯&#xff01; 导读 虹科CSS的CANedge数据记录仪专为汽车和工业领域的工程师设计&#xff0c;旨在通过监控现场资产来支持研发、诊断和预测性维护。为了将这些数据转化为直观的可视化信息&#xff0c;工程师们通常依赖于Grafana仪表板…

MuMu模拟器12 KitsumeMask安装教程

这里是引用"> 在MuMu模拟器上安装KitsumeMask的时候遇到安装失败的情况。 一、下载APK安装包 如果你没有apk安装包可以通过下面的百度网盘进行下载 通过网盘分享的文件:KitsumeMask 链接: https://pan.baidu.com/s/1yeq3I6BsUD7J6uI-bnk-Vw?pwd=7n3v 提取码: 7n3v 二…

【LeetCode】动态规划—123. 买卖股票的最佳时机 III(附完整Python/C++代码)

动态规划—123. 买卖股票的最佳时机 III 题目描述前言基本思路1. 问题定义2. 理解问题和递推关系状态定义&#xff1a;状态转移公式&#xff1a;初始条件&#xff1a; 3. 解决方法动态规划方法伪代码&#xff1a; 4. 进一步优化5. 小总结 Python代码Python代码解释 C代码C代码解…

『网络游戏』代码操作数据库增删改查【22】

创建一个新的Vistual Studio案例工程 命名为SqlTest 导入MySql.dll (官网安装即可) 导入到新建工程创建Libs文件夹放里即可 浏览找到位置添加引用即可 1.增加数据 编写脚本&#xff1a;Program 运行工程 - 添加/插入完成 打开navicat查看数据库表信息 在增加数据中可以获取主…

如何安装Tensorflow GPU版本

可以安装对应版本的cudatoolkit cudnn 我这次需要安装tensorflow-gpu1.15.0 经查看 对应的cuda 10 所以&#xff1a; conda install cudatoolkit10.0.130它对应的是cudnn 7.4 但是没安装成功 然后我直接输入 conda install cudnn 它根据cuda10 找到了对应的cudnn 7.6.…