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

什么是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 请求,要求获取所有文章的信息

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

鸿蒙应用开发:全面认识鸿蒙系统

前言 随着智能设备的普及和物联网的发展&#xff0c;对操作系统的需求也越来越多样化。鸿蒙操作系统作为一款面向全场景的分布式操作系统&#xff0c;其适用范围非常广泛&#xff0c;从智能手机到家用电器&#xff0c;再到工业设备&#xff0c;都能找到应用场景。特别是在智能…

【含开题报告+文档+PPT+源码】基于SSM的景行天下旅游网站的设计与实现

开题报告 随着互联网的快速发展&#xff0c;旅游业也逐渐进入了数字化时代。作为一个旅游目的地&#xff0c;云浮市意识到了互联网在促进旅游业发展方面的巨大潜力。为了更好地推广云浮的旅游资源&#xff0c;提高旅游服务质量&#xff0c;云浮市决定开发一个专门的旅游网站。…

使用开源的 Vue 移动端表单设计器创建表单

FcDesigner Vant 版是一款基于 Vue3.0 的移动端低代码可视化表单设计器工具&#xff0c;通过数据驱动表单渲染。可以通过拖拽的方式快速创建表单&#xff0c;提高开发者对表单的开发效率&#xff0c;节省开发者的时间。 源码下载 | 演示地址 | 帮助文档 本项目采用 Vue3.0 和 …

数字后端零基础入门系列 | Innovus零基础LAB学习Day1

一 Floorplan 数字IC后端设计如何从零基础快速入门&#xff1f;(内附数字IC后端学习视频&#xff09; Lab5-1这个lab学习目标很明确——启动Innovus工具并完成设计的导入。 在进入lab之前&#xff0c;我们需要进入我们的FPR工作目录。 其中ic062为个人服务器账户。比如你端…

竞品分析|用户体验五要素|KANO模型

用户体验五要素 我感觉产品的设计师从最底层的战略层确定&#xff0c;再依次上升一层层确定直至最后确定表现层输出给用户的视觉效果。 KANO模型 KANO 模型是东京理工大学教授狩野纪昭(Noriaki Kano)发明的对用户需求分类和优先排序的有用工具&#xff0c;以分析用户需求对用…

harbor 如何做到物理删除镜像 harbor镜像清理脚本

一、背景 相比于nexus&#xff0c;harbor的一大优点是方便及时清理无用的docker镜像。本文就harbor怎么设置清理&#xff0c;梳理一下具体的操作办法。 harbor 版本是 v2.9.0 二、目标 随着我们推送至仓库的镜像越来越多&#xff0c;带来的一个最大运维问题就是存储空间的浪…

SL3037B降压恒压芯片DC24伏输入5伏输出带单片机,电流100mA

一、SL3037B芯片概述 SL3037B是一款内置功率MOSFET的单片降压型开关模式转换器&#xff0c;具有高效、稳定、外围元器件少等特点。它能够在宽输入电源范围&#xff08;5.5~60V&#xff09;内实现0.6A的峰值输出电流&#xff0c;并具有出色的线电压和负载调整率。此外&#xff…

利用LangChain实现大语言模型与数据库的交互对话

大语言模型使用LangChain与数据库对话 大型语言模型&#xff08;LLMs&#xff09;的兴起在技术上带来了重大转变&#xff0c;使开发者能够创建曾经难以想象的应用程序。LangChain 是一个提示编排工具&#xff0c;利用LLMs的能力改变你与数据库的通信方式。通过LangChain&#…

从零讲解线性回归(Linear Regression)

Linear Regression 线性回归 线性回归是一种简单且常用的技术&#xff0c;用来预测连续变量&#xff0c;假设预测变量&#xff08;自变量&#xff0c; x_i &#xff09;和结果变量&#xff08;因变量&#xff0c; y_i &#xff09;之间存在线性关系。线性回归公式&#xff08…

Qt自定义一个圆角对话框

如何得到一个圆角对话框&#xff1f; 步骤&#xff1a; 1、继承自QDiaglog 2、去掉系统自带的边框 3、设置背景透明,不设置4个角会有多余的部分出现颜色 4、对话框内部添加1个QWidget&#xff0c;给这个widget设置圆角&#xff0c;并添加到布局中让他充满对话框 5、后续对…

智慧校园打架斗殴检测预警系统 异常奔跑检测系统 Python 和 OpenCV 实现简单

在当今数字化时代&#xff0c;智慧校园建设已成为教育领域的重要发展方向。校园安全作为学校管理的重中之重&#xff0c;如何借助先进的技术手段实现高效、精准的安全监控&#xff0c;成为了教育工作者和技术专家共同关注的焦点。其中&#xff0c;智慧校园打架斗殴检测预警系统…

linux线程 | 线程的控制(上)

前言&#xff1a;本节内容为线程的控制。在本篇文章中&#xff0c; 博主不仅将会带友友们认识接口&#xff0c; 使用接口。 而且也会剖析底层&#xff0c;带领友友们理解线程的底层原理。 相信友友们学完本节内容&#xff0c; 一定会对线程的控制有一个很好的把握。 那么&#…

Spring AI 整体介绍_关键组件快速入门_prompt_embedding等

Spring AI&#xff1a;Java开发者的AI集成新利器 在过去&#xff0c;Java开发者在构建AI应用时面临着缺乏统一框架的问题&#xff0c;导致不同AI服务的集成过程复杂且耗时。Spring AI应运而生&#xff0c;旨在为基于Java的应用程序提供一个标准化、高效且易于使用的AI开发平台…

用PHP爬虫API数据获取商品SKU信息实战指南

在电子商务的精细化运营中&#xff0c;SKU&#xff08;Stock Keeping Unit&#xff0c;库存单位&#xff09;信息是商品管理的核心。它不仅包含了商品的规格、价格、库存等关键数据&#xff0c;还直接影响到库存管理、价格策略和市场分析等多个方面。本文将介绍如何使用PHP爬虫…

Java程序设计:spring boot(3)——spring boot核心配置

目录 1 设置 Banner 图标 1.1 Banner 图标⾃定义 1.2 Banner 图标关闭 2 Spring Boot 配置⽂件 3 Starter 坐标 & ⾃动化配置 3.1 Starter坐标配置 3.1.1 Web starter 3.1.2 Freemarker Starter & Thymeleaf starter 3.1.3 JavaMail邮件发送 Starter 3.1.4 引…

mysql--表的约束

目录 理解表的约束和操作 如何理解&#xff1f; 1、空属性null 2、默认值default 3、列描述comment 4、自动填充zorefill 5、主键primary key &#xff08;1&#xff09;创建表时指定可以 &#xff08;2&#xff09;创建表后指定key &#xff08;3&#xff09;删除主…

注册函数和回调函数使用讲解

1.概念 注册和回调函数在C语言编程中非常常见&#xff0c;也经常用到。注册和回调的机制也大量使用在Linux内核中。学会使用注册和回调函数是C语言开发者应当掌握的一项编程技能。 函数的本质在内存上体现的是地址。我们知道函数的地址后&#xff0c;就能够调用这个函数。 …

ESP32移植Openharmony外设篇(1)MQ-2烟雾传感器

外设篇 实验箱介绍 旗舰版实验箱由2部分组成&#xff1a;鸿蒙外设模块&#xff08;支持同时8个工作&#xff09;、鸿蒙平板。 其中&#xff0c;鸿蒙平板默认采用RK3566方案。 OpenHarmony外设模块采用底板传感器拓展板方式&#xff0c;底板默认采用ESP32方案&#xff0c;也…

部署Qwen2.5-7b大模型详解

部署Qwen2.5-7b大模型详解 本文参考教程&#xff1a;https://qwen.readthedocs.io/en/latest/getting_started/quickstart.html 下载模型 https://modelscope.cn/organization/qwen 搜索 qwen2.5-7b 可以看到它提供了六个模型&#xff0c;以满足不同的需求&#xff0c;从下…

HBuilder X中搭建Vue-cli项目组件和路由以及UI库使用(二)

一、创建组件 &#xff08;1&#xff09;在vj1项目src|右键|vue文件 &#xff08;2&#xff09;组件常用模版 <!--该标签用于写HTML代码,必须有一个根标签,如下<div>是根标签--> <template> <div>首页</div> </template><!--该标签用…