【Vue工程】011-Axios

这篇具有很好参考价值的文章主要介绍了【Vue工程】011-Axios。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

【Vue工程】011-Axios

一、概述

1、简介

Slogan:易用、简洁且高效的http库。

2、官网

官网:http://www.axios-js.com/zh-cn/

文档:http://www.axios-js.com/zh-cn/docs/

3、訾博其他相关博客

【axios】001-axios概述、特点、文档说明

https://blog.csdn.net/qq_29689343/article/details/109193487

【axios】002-axios发起请求

https://blog.csdn.net/qq_29689343/article/details/109193620

axios封装

https://blog.csdn.net/qq_29689343/article/details/118193238文章来源地址https://www.toymoban.com/news/detail-451261.html

二、基本使用

使用示例,仅作为参考!

1、安装

pnpm add axios

2、创建一个 token 状态

/src/store/token.ts

// import api from '@/api'

import { defineStore } from 'pinia';

const useTokenStore = defineStore(
  // 唯一ID
  'token',
  {
    state: () => ({
      token: localStorage.token,
      failuretime: localStorage.failuretime,
    }),
    getters: {
      isLogin: (state) => {
        let retn = false;
        if (state.token != null) {
          const unix = Date.parse(new Date().toString());
          if (unix < state.failuretime * 1000) {
            retn = true;
          }
        }
        return retn;
      },
    },
    actions: {
      login() {
        return new Promise<void>((resolve) => {
          // 模拟登录成功,写入 token 信息
          localStorage.setItem('token', '1234567890');
          localStorage.setItem(
            'failuretime',
            (
              Date.parse(new Date().toString()) / 1000 +
              24 * 60 * 60
            ).toString(),
          );
          this.token = '1234567890';
          this.failuretime =
            Date.parse(new Date().toString()) / 1000 + 24 * 60 * 60;
          resolve();
        });
      },
      // login(data) {
      //   return new Promise((resolve, reject) => {
      //     api.post('member/login', data).then((res) => {
      //       localStorage.setItem('token', '1234567890')
      //       localStorage.setItem('failuretime', Date.parse(new Date()) / 1000 + 24 * 60 * 60)
      //       this.token = '1234567890'
      //       this.failuretime = Date.parse(new Date()) / 1000 + 24 * 60 * 60
      //       resolve(res)
      //     }).catch((error) => {
      //       reject(error)
      //     })
      //   })
      // },
      logout() {
        return new Promise<void>((resolve) => {
          // 模拟退出登录,清除 token 信息
          localStorage.removeItem('token');
          localStorage.removeItem('failuretime');
          this.token = null;
          this.failuretime = null;
          resolve();
        });
      },
    },
  },
);

export default useTokenStore;

3、axios 封装

/src/api/index.ts

import axios from 'axios';

// import qs from 'qs'
import router from '@/router/index';
import useTokenStore from '@/store/token';

// 登录
async function toLogin() {
  await useTokenStore().logout();
  await router.push({
    path: '/login',
    query: {
      redirect: router.currentRoute.value.fullPath,
    },
  });
}

// axios 实例
const api = axios.create({
  baseURL:
    import.meta.env.DEV && import.meta.env.VITE_OPEN_PROXY === 'true'
      ? '/proxy/'
      : import.meta.env.VITE_APP_API_BASEURL,
  timeout: 1000 * 60,
  responseType: 'json',
});

/**
 * 请求拦截器
 */
api.interceptors.request.use((config) => {
  const tokenStore = useTokenStore();
  /**
   * 全局拦截请求发送前提交的参数
   * 以下代码为示例,在请求头里带上 token 信息
   */
  if (tokenStore.isLogin && config.headers) {
    config.headers.Token = tokenStore.token;
  }
  // 是否将 POST 请求参数进行字符串化处理
  if (config.method === 'post') {
    // config.data = qs.stringify(config.data, {
    //   arrayFormat: 'brackets',
    // })
  }
  return config;
});

/**
 * 响应拦截器
 */
api.interceptors.response.use(
  async (response) => {
    /**
     * 全局拦截请求发送后返回的数据,如果数据有报错则在这做全局的错误提示
     * 假设返回数据格式为:{ status: 1, error: '', data: '' }
     * 规则是当 status 为 1 时表示请求成功,为 0 时表示接口需要登录或者登录状态失效,需要重新登录
     * 请求出错时 error 会返回错误信息
     */
    if (response.data.status === 1) {
      if (response.data.error !== '') {
        // 这里做错误提示,如果使用了 element plus 则可以使用 Message 进行提示
        // Message.error(options)
        return Promise.reject(response.data);
      }
    } else {
      await toLogin();
    }
    return Promise.resolve(response.data);
  },
  (error) => {
    let message = error.message;
    if (message === 'Network Error') {
      message = '后端网络故障';
    } else if (message.includes('timeout')) {
      message = '接口请求超时';
    } else if (message.includes('Request failed with status code')) {
      message = `接口${message.substr(message.length - 3)}异常`;
    }
    return Promise.reject(error);
  },
);

export default api;

4、使用示例

设置 baseURL

在根目录 .env.* 文件里的 VITE_APP_API_BASEURL 这个参数就是配置 axios 的 baseURL

例如项目的真实接口请求地址为:

  • http://api.test.com/news/list
  • http://api.test.com/news/create
  • http://api.test.com/shop/info

则可设置为 VITE_APP_API_BASEURL = http://api.test.com/

请求调用

常用的 get 和 post 请求可使用以下的方法:

any 应该被替换成具体的类型!

import api from '@/api';

// GET 请求
export const getList = () => {
  return api.get<any>('/list', {
    params: {
      page: 1,
      size: 10,
    },
  });
};

// POST 请求
export const createNews = () => {
  return api.post<any>('news/create', {
    title: '新闻标题',
    content: '新闻内容',
  });
};

拦截器

/src/api/index.ts 文件里实例化了 axios 对象,并对 request 和 response 设置了拦截器,拦截器的用处就是拦截每一次的请求和响应,然后做一些全局的处理。例如接口响应报错,可以在拦截器里用统一的报错提示来展示,方便业务开发。但因为每个公司提供的接口标准不同,所以该文件拦截器部分的代码,需要开发者根据实际情况去修改调整。

代码很简单,首先初始化 axios 对象,然后 axios.interceptors.request.use()axios.interceptors.response.use() 就分别是请求和响应的拦截代码了。

参考代码里只做了简单的拦截处理,例如请求的时候会自动带上 token ,响应的时候会根据错误信息判断是登录失效还是接口报错,并做相应动作。

三、其它

更复杂(完整)的封装,可参考 vben 的封装。

https://blog.csdn.net/qq_29689343/article/details/118193238

到了这里,关于【Vue工程】011-Axios的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 小白系列Vite-Vue3-TypeScript:011-登录界面搭建及动态路由配置

    前面几篇文章我们介绍的都是Vite+Vue3+TypeScript项目中环境相关的配置,接下来我们开始进入系统搭建部分。本篇我们来介绍登录界面搭建及动态路由配置,大家一起撸起来...... 项目登陆接口是通过mockjs前端来模拟的 模拟服务接口LoginApi 首先在src/mock文件夹下新建login.ts文件,

    2024年02月04日
    浏览(29)
  • Axios简介

    Axios 1.Axios简介 Axios 是一个基于 promise 的 HTTP 库,可以用在浏览器和 node.js 中 axios的github: https://github.com/axios/axios Axios 是一个基于 promise 的 HTTP 库,简单的讲就是可以发送get、post等请求,可以用在浏览器和 node.js 中。React等框架的出现,促使了Axios轻量级库的出现,因为Vue等,

    2024年02月06日
    浏览(16)
  • axios.interceptors.request.use简介

    axios.interceptors.request.use 方法返回一个函数,该函数接受一个参数 config ,并返回 config 或 Promise`,这样可以修改请求配置或在发送请求之前执行其他操作。 下面是一个示例,其中拦截器在请求头中添加了一个token: 在这个示例中,拦截器函数首先从本地存储中获取token,然后

    2024年02月05日
    浏览(17)
  • 【前端框架】NPM概述及使用简介

    npm之于Node,就像pip之于Python,gem之于Ruby,composer之于PHP。 npm是Node官方提供的包管理工具,他已经成了Node包的标准发布平台,用于Node包的发布、传播、依赖控制。npm提供了命令行工具,使你可以方便地下载、安装、升级、删除包,也可以让你作为开发者发布并维护包。 npm是随

    2024年02月03日
    浏览(27)
  • 卡尔曼滤波器简介——概述

    关于卡尔曼滤波器         大多数现代系统都有许多传感器,可以根据一系列测量来估计隐藏(未知)状态。例如,GPS接收器提供位置和速度估计,其中位置和速度是隐藏状态,卫星信号到达的差分时间是测量值。         跟踪和控制系统的最大挑战之一是在存在不确

    2024年02月01日
    浏览(60)
  • MySQL-概述-数据模型&SQL简介

    数据库: D ata B ase(DB),是存储和管理数据的仓库 数据库管理系统: D ata B ase M anagement S ystem(DBMS),操作和管理数据库的大型软件。 SQL: S tructured Q uery L anguage(结构化查询语言),操作关系型数据库的编程语言,定义一套操作关系型数据库统一 标准 。 MySQL-企业开发使

    2024年02月16日
    浏览(21)
  • 软件工程概述

    计算机软件 计算机软件指计算机系统中的程序及其文档 程序是计算任务的处理对象和处理规则的描述 任务:以计算机为处理工具的任务都是计算任务 处理对象:数据(如数据、文字、图形、图像、声音等,他们都是表示,而无含义)或信息(数据及有关的含义) 处理规则一般指

    2023年04月21日
    浏览(28)
  • 新能源科学与工程专业概述

    英文名称:New Energy Science and Engineering 新能源科学与工程 该专业为2011年新增专业,主要学习新能源的种类和特点、利用的方式和方法、应用的现状和未来的发展趋势。具体内容涉及太阳能、风能、生物质能、核电能、化石能源等等。 近年来我国经济持续高速增长,传统能源

    2024年02月03日
    浏览(38)
  • 1-Docker虚拟化平台技术概述及简介

    通俗的说,虚拟化就是把物理资源转变为逻辑上可以管理的资源,以打破物理结构间的壁垒,计算元件运行在虚拟的基础上而不是真实的基础上,可以扩大硬件的容量,简化软件的重新配置过程。允许一个平台同时运行多个操作系统,并且应用程序都可以在相互独立的空间内

    2024年02月06日
    浏览(34)
  • 十年JAVA搬砖路——软件工程概述

    软件工程是一门关注软件开发过程的学科 ,它涉及到软件的设计、开发、测试、部署和维护等方面。软件工程的目标是通过系统化的方法和工具,以确保软件项目能够按时、按预算和按要求完成。 软件生命周期:软件生命周期是指软件从概念到退役的整个过程,包括需求分

    2024年02月10日
    浏览(28)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包