vue axios 接口请求封装

43 篇文章 2 订阅

一、封装文件 src/utils/request.js 

环境变量 base 接口地址设置 vue 项目环境变量设置

import axios from "axios";
import { getToken } from "@u/auth";

/**
 * 创建 axios 实例
 */
const service = axios.create({
  baseURL: process.env.VUE_APP_BASE_API, // 环境变量base接口地址 url = base url + request url
  withCredentials: true, // 跨域请求时发送Cookie
  timeout: 60000, // 请求超时
  headers: {
    "Content-Type": "application/json;q=1.0,*/*;q=0.1",
  },
});

/**
 * 全局 请求拦截器, 支持添加多个拦截器
 * 例如: 配置token、添加一些默认的参数
 * `return config` 继续发送请求
 */
service.interceptors.request.use(
  (config) => {
    // 设置Token
    getToken() && (config.headers["X-Token"] = getToken());

    return config;
  },
  (error) => {
    // 做一些请求错误
    console.error(error);
    return Promise.reject(error);
  }
);

/**
 * 全局 响应拦截器, 支持添加多个拦截器
 * 例如: 根据状态码选择性拦截、过滤转换数据
 * @param {Object} res 请求返回的数据
 * @return {Promise<reject>}
 */
service.interceptors.response.use(
  async (res) => {
    const { data, status } = res;

    try {
      return await handleCode({ data, status});
    } catch (err) {
      return Promise.reject(err);
    }
  },
  (err) => {
    return Promise.reject(err);
  }
);

/**
 * 处理 HTTP 状态码
 * @param data {Object} 请求返回的数据
 * @param status {String} HTTP状态码
 * @param rHeader {Object} 响应头
 * @returns {Promise<never>|*}
 */
function handleCode({ data, status}) {
  const STATUS = {
    "200"() {
      return data;
    },
    "400"() {
      return Promise.reject(new Error("请求错误"));
    },
    "401"() {
      return Promise.reject(new Error("请求未授权"));
    },
    "403"() {
      return Promise.reject(new Error("拒绝请求"));
    },
    "500"() {
      return Promise.reject(new Error("服务器错误"));
    },
  };
  // 有状态码但不在这个封装的配置里,就直接返回错误
  return STATUS[status]
    ? STATUS[status]()
    : Promise.reject(new Error(data.data || "请求错误"));
}

export default service;

二、设置|获取token src/utils/auth.js

import Cookies from "js-cookie";

const TokenKey = "vue_admin_token";

/**
 * 获取TOKEN
 * @returns {*}
 */
export function getToken() {
  return Cookies.get(TokenKey);
}

/**
 * 设置TOKEN
 * @param token {String}
 * @returns {*}
 */
export function setToken(token) {
  return Cookies.set(TokenKey, token);
}

/**
 * 移除TOKEN
 * @returns {*}
 */
export function removeToken() {
  return Cookies.remove(TokenKey);
}

三、接口文件 src/api/user.js

import request from "@u/request";

/**
 * 获取会员列表
 * @param params
 * @returns {AxiosPromise}
 */
export function getUsers(params) {
  return request({
    url: "/users",
    method: "get",
    params
  });
}

/**
 * 获取当前用户信息
 * @param data
 * @returns {AxiosPromise}
 */
export function getUserInfo(data) {
  return request({
    url: "/user/acquire-user-info",
    method: "post",
    data,
  });
}

四、页面使用示例

<template>
  <div class="app-container"></div>
</template>

<script>
import { getUsers } from "@i/user";

export default {
  name: "Users",
  components: {},
  data() {
    return {
      list: []
    };
  },
  computed: {},
  watch: {},
  created() {
    // page 当前页数 limit 每页数量
    getUsers({ page:1, limit: 20 }).then((res) => {
      this.list = res.data;
    });
  },
  methods: {},
};
</script>

五、其他文件

路径别名 vue.config.js

configureWebpack: {
    // 在webpack的名称字段中提供应用程序的标题,以便
    // 可以在index.html中对其进行访问以注入正确的标题。
    name: name,
    resolve: {
      alias: {
        "@": resolve("src"),
        "@i": resolve("src/api"),
        "@c": resolve("src/components"),
        "@a": resolve("src/assets"),
        "@s": resolve("src/styles"),
        "@u": resolve("src/utils"),
        "@v": resolve("src/views"),
      },
    },
  },

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱宇阳

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值