vue基础-axios封装/同步请求

news2024/11/18 19:30:23

📖 本章介绍 Vue 项目中如何使用 Axios 封装 http 请求,请求/响应拦截器部分写的比较简单,后续项目中可以补充。

💦 1、/src/utils/目录下建立一个htttp.js

  1. 导入axios
  2. 设置axios请求参数
  3. 创建axios实例
  4. 请求拦截器
  5. 响应拦截器
  6. 封装get请求导出
  7. 封装post请求导出
// 0、导入axios
import axios from 'axios'

// 1、设置axios请求参数
axios.defaults.timeout = 5000; //请求超时5秒
axios.defaults.baseURL = ''; //请求base url
axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded'; //设置post请求是的header信息

// 2、创建axios实例
const service = axios.create({
    timeout: 60000
})

// 3、请求拦截器
service.interceptors.request.use(config => {
    // 每次发送请求之前,此处做校验
    console.log("请求拦截器1调用成功");
    let token = sessionStorage.getItem('token')
    if (token) { // 判断是否存在token,如果存在的话,则每个http header都加上token
        config.headers = {
            'X-token': token
        }
    }
    return config
}, error => {
    console.log("请求拦截器1调用失败");
    return Promise.reject(error)
})

// 4、响应拦截器
service.interceptors.response.use(response => {
    // 如果返回的状态码为200,说明接口请求成功,可以正常拿到数据
    // 否则的话抛出错误
    if (response.status === 200) {
        console.log("响应拦截器1调用成功");
        if (response.data.code === 511) {
            // 未授权调取授权接口
        } else if (response.data.code === 510) {
            // 未登录跳转登录页
        } else {
            return Promise.resolve(response)
        }
    } else {
        return Promise.reject(response)
    }
}, error => {
    // 我们可以在这里对异常状态作统一处理
    if (error.response.status) {
        // 处理请求失败的情况
        // 对不同返回码对相应处理
        console.log("响应拦截器1调用失败");
        return Promise.reject(error.response)
    }
})

// 5、导出实例
export default service

// 6.1、封装get请求导出
/**
 * 封装get方法
 * @param url
 * @param data
 * @returns {Promise}
 */

export function getApi(url, params = {}, headers = {}) {
    return new Promise((resolve, reject) => {
        service.get(url, {
            params: params,
            headers: headers
        })
        .then(response => {
            resolve(response.data);
        })
        .catch(err => {
            reject(err)
        })
    })
}

// 6.2、封装post请求导出
/**
 * 封装post请求
 * @param url
 * @param data
 * @returns {Promise}
 */

export function postApi(url, data = {}) {
    return new Promise((resolve, reject) => {
        service.post(url, data)
        .then(response => {
            resolve(response.data);
        }, err => {
            reject(err)
        })
    })
}

💦 2、组件内使用

<template>
  <div>
    <button @click="send">发送get</button>
    <br />
    {{info}}
  </div>
</template>

<script>
import axios from "axios";
import {postApi,getApi} from '@/utils/http.js'

export default {
  data() {
    return {
      info: ""
    };
  },
  methods: {
    send() {
      getApi("/testapi/try/ajax/json_demo.json")
      .then(response => {
        console.log(response);
        console.log(response.sites);
        this.info = response;
      });
    }
  }
};
</script>

在这里插入图片描述

📌 传递参数

export default {
  data() {
    return {
      info: ""
    };
  },
  methods: {
    send() {
      getApi("/testapi/try/ajax/json_demo.json", {
        param1: 'aaaa',
        param2: 'bbbb'
      }, {
        'Content-Type': 'application/x-www-form-urlencoded'
      })
      .then(response => {
        this.info = response;
      });
    }
  }
};

在这里插入图片描述

📅 同步请求
Axios 是一个基于 Promise 的 HTTP 库。而 async/await 是一种建立在 Promise 之上的编写异步或非阻塞代码的新方法。

🎈场景:一个请求需要依次同步请求多个其他请求

queryData('http://localhost:3000/test1')
  .then(function (data) {
     console.log(data);
     return queryData('http://localhost:3000/test2');
  })
  .then(function (data) {
     console.log(data);
     return queryData('http://localhost:3000/test3');
  })
  .then(function (data) {
     console.log(data);
  });

如果要按顺序发送多次请求,还是有些麻烦的,因为我们需要一直去 .then 来得到结果,上述代码还会带来 回调地狱 问题。

📌 所以在 ES7 中有了一种新的语法:async/await,可以更加方便的进行异步操作,先看一下上面的请求如果在 axios 中用这个语法来写是什么效果:

axios.defaults.baseURL = 'http://localhost:3000';
async function queryData() {
    var ret = await axios.get('/test1');
    var ret1 = await axios.get('/test2');
    var ret2 = await axios.get('/test3');
    return [ret, ret1, ret2];
}

console.log(queryData());

在这里插入图片描述

📌 代码看起来更加简洁,就像是同步执行一样,省略了 .then 取到结果的过程。

📚参考文章:
📖axios进行同步请求(async+await)

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

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

相关文章

文件上传

js绕过 打开网页尝试上传一句话木马&#xff0c;发现只能上传图片文件 审计源代码&#xff0c;发现使用一个checkfile函数js对文件类型进行了屏蔽 于是我们修改网页代码&#xff0c;去除返回值的检查函数 checkFile() 上传成功&#xff0c;使用蚁剑连接 连接成功 .htaccess绕…

F5 LTM 知识点和实验 3-负载均衡中的负载算法

第三章&#xff1a;负载均衡中的负载算法 负载算法分为静态的和动态的。静态的连接分布模式是预先设置的&#xff0c;流量处理中是不会变化的&#xff0c;动态的连接分布模式也是预先设置的&#xff0c;但是连接分布会根据某些因素的改变而调整。 轮询&#xff08;round robi…

基于python和pygame实现的植物大战僵尸

游戏的实现流程和思路&#xff1a; 游戏资源准备&#xff1a; 加载所有游戏中需要用到的图像资源&#xff0c;如植物、僵尸、子弹、背景等&#xff0c;并将它们保存在GFX字典中。 游戏状态管理&#xff1a; 定义了一个抽象基类State&#xff0c;表示游戏中的不同状态&#xff0…

Jenkins+Gitlab+Maven集成CI/CD

MavenGitlab集成 配置好下列环境 # Java环境 JAVA_HOME /usr/lib/jvm/java-11-openjdk-11.0.19.0.7-1.el7_9.x86_64# Maven环境 MAVEN_HOME /usr/local/maven# Maven环境变量 PATHEXTRA $MAVEN_HOME/bin1. 配置settings.xml路径 2. 安装maven插件 创建项目 配置gitlab地址和指…

【强化学习】Q-learning训练AI走迷宫

0. 简单总结 Q-learning&#xff1f; 最简单的强化学习算法&#xff01;不需要深度学习网络的算法&#xff01;带有概率性的穷举特性&#xff01;&#xff08;甚至还有一点点动态规划的感觉&#xff09; 1. Q-learning介绍 Q-learning是一种基于强化学习的算法&#xff0c;…

小程序轮播图的两种后台方式(JSP)--【浅入深出系列009】

微信目录集链接在此&#xff1a; 详细解析黑马微信小程序视频–【思维导图知识范围】难度★✰✰✰✰ 不会导入/打开小程序的看这里&#xff1a;参考 让别人的小程序长成自己的样子-更换window上下颜色–【浅入深出系列001】 文章目录 本系列校训学习资源的选择啥是轮播图轮播…

Retrospectives on the Embodied AI Workshop(嵌入式人工智能研讨会回顾) 论文阅读

论文信息 题目&#xff1a;Retrospectives on the Embodied AI Workshop 作者&#xff1a;Matt Deitke, Dhruv Batra, Yonatan Bisk 来源&#xff1a;arXiv 论文地址&#xff1a;https://arxiv.org/pdf/2210.06849 Abstract 我们的分析重点关注 CVPR Embodied AI Workshop 上…

一个开源的文件存储软件Filehub,不限速防和谐

FileHub介绍 一个基于Github开发的文件存储软件&#xff0c;美其名曰&#xff1a;FileHub&#xff0c;可存万物&#xff0c;而且绝不和谐任何文件。类似于百度云盘的功能&#xff0c;但是功能上肯定达不到百度云盘的效果&#xff0c;但是基本功能还是有的&#xff1a;例如登录注…

如何实现高效的动态鉴权

一、概述 Spring Security 是 Spring 框架内高度可定制化的安全框架&#xff0c;也是 Spring 应用的标准安全框架&#xff0c;提供了包括认证和鉴权在内的两大部分。其高度集成于 Spring 框架&#xff0c;无需引入第三方扩展模块&#xff0c;可以避 免大量的数据接口适配问题…

如何使用Git上传代码到GitHub简单教程

学习笔记 1&#xff1a;Github创建自己的一个repositories 2&#xff1a;随便给仓库取个名字 3&#xff1a;接下来&#xff0c;打开git 4&#xff1a;通过 cd 你的本地文件路径 &#xff0c;进入到该路径下 5&#xff1a;初始化项目&#xff0c;在目录下面运行完该代码后会有…

Linux6.16 Docker consul的容器服务更新与发现

文章目录 计算机系统5G云计算第四章 LINUX Docker consul的容器服务更新与发现一、consul 概述1.什么是服务注册与发现2.什么是consul 二、consul 部署1.consul服务器2.registrator服务器3.consul-template4.consul 多节点 计算机系统 5G云计算 第四章 LINUX Docker consul的…

高压放大器在超声加工中的应用

超声加工是一种非常重要的现代加工技术&#xff0c;广泛应用于材料加工、精密制造等领域。在该技术中&#xff0c;高压放大器扮演着至关重要的角色&#xff0c;可以为超声加工提供必要的信号放大和控制功能。 超声加工的原理是通过高频振动产生机械能&#xff0c;并将其传递到被…

编程小白的自学笔记十二(python爬虫入门四Selenium的使用实例二)

系列文章目录 编程小白的自学笔记十一&#xff08;python爬虫入门三Selenium的使用实例详解&#xff09; 编程小白的自学笔记十&#xff08;python爬虫入门二实例代码详解&#xff09; 编程小白的自学笔记九&#xff08;python爬虫入门代码详解&#xff09; 目录 系列文章…

Jmeter性能测试配置

Jmeter检查点/断言 在上一章节中&#xff0c;我们通过调试脚本&#xff0c;通过人工验证脚本可以完成业务功能&#xff0c; 但在性能测试中&#xff0c;我们希望能通过自动验证脚本是否完成业务功能&#xff0c;在Jmeter 中我们可以通过检查点&#xff0c;也就是断言来实现自动…

19.2:纸牌问题

给定一个整型数组arr&#xff0c;代表数值不同的纸牌排成一条线 玩家A和玩家B依次拿走每张纸牌 规定玩家A先拿&#xff0c;玩家B后拿 但是每个玩家每次只能拿走最左或最右的纸牌 玩家A和玩家B都绝顶聪明 请返回最后获胜者的分数 方法一&#xff1a;暴力解法 自然智慧。 pack…

【NLP入门教程】二十三、循环神经网络(RNN)| 小白专场

本教程旨在为初学者提供一份全面而系统的NLP入门指南&#xff0c;探索NLP的核心概念、方法和技术。无论你是计算机科学的新手&#xff0c;还是对自然语言处理领域感兴趣的研究人员&#xff0c;本教程都将为你提供所需的基础知识和实用技能。 专栏地址&#xff1a;&#x1f4d5…

【蓝图】p40-p43对象引用、变量有效性、实现键盘控制物体自转、简单点名系统

p40-p43对象引用、变量有效性、实现键盘控制物体自转、简单点名系统 p40对象引用、变量有效性p41实现键盘控制物体自转创建bool值控制旋转实现通过键盘控制自转 p42p43简单点名系统Get All Actors Of Class&#xff08;获得场景中所有该类的actor演员&#xff09;getFor Each L…

TEE GP(Global Platform)安全认证产品

TEE之GP(Global Platform)认证汇总 一、安全认证产品介绍 选择SECURITY和TEE SECURITY&#xff0c;然后SEARCH&#xff0c;可以看到TEE对应的安全认证产品。 二、HUAWEI ITRUSTEE V3.0 ON KIRIN 980 三、SAMSUNG TEEGRIS V4.1 参考&#xff1a; GlobalPlatform Certification…

【linux】暗夜精灵9自动升级BIOS后,无法进入双系统

1、问题描述 暗夜精灵9自动升级BIOS后,无法进入双系统,甚至没有“多重引导菜单” 2、解决方法 1)进入BIOS 惠普暗夜精灵9进入BIOS的按键是F10 2)设置启动项 需要设置三处 功能键延时:5秒 安全启动模式:关闭 UEFI模式下的开机顺序:ubuntu3)设置显卡切换 如果NVIDIA…

TCL(Tool Command Language)学习(三)-----字符串操作

一、比较 &#xff1a; string compare 格式 &#xff1a; string compare ?-nocase? ?-length int? string1 string2 把字符串 string1 和字符串 string2 进行比较 &#xff0c;返回值为 -1、0或 1 &#xff0c;分别对应 string1 小于、等于或大于string2。如果有 -len…