vue axios 接口请求封装优化

43 篇文章 2 订阅

vue axios 接口请求封装

主要区别是增加xhr.js 管理接口

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

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 { service as axios };

二、管理接口文件 src/utils/xhr.js

import { axios } from "@u/request";

/**
 * get 请求方式
 * @param url {String} 接口地址
 * @param params {Object} 接口参数
 * @returns {AxiosPromise}
 * @constructor
 */
export function mGet(url, params) {
  return axios({
    url: url,
    method: "get",
    params,
  });
}

/**
 * post 请求方式
 * @param url {String} 接口地址
 * @param data {Object} 接口参数
 * @returns {AxiosPromise}
 * @constructor
 */
export function mPost(url, data) {
  return axios({
    url: url,
    method: "post",
    data,
  });
}

/**
 * put 请求方式-用于修改全部数据
 * @param url {String} 接口地址
 * @param data {Object} 接口参数
 * @returns {AxiosPromise}
 * @constructor
 */
export function mPut(url, data) {
  return axios({
    url: url,
    method: "put",
    data,
  });
}

/**
 * patch 请求方式-用于修改单项或多项数据
 * @param url {String} 接口地址
 * @param data {Object} 接口参数
 * @returns {AxiosPromise}
 * @constructor
 */
export function mPatch(url, data) {
  return axios({
    url: url,
    method: "patch",
    data,
  });
}

/**
 * delete 请求方式
 * @param url {String} 接口地址
 * @param params {Object} 接口参数
 * @returns {AxiosPromise}
 */
export function mDelete(url, params) {
  return axios({
    url: url,
    method: "delete",
    params,
  });
}

/**
 * 下载文件
 * @param url {String} 接口地址
 * @param params {Object} 接口参数
 * @returns {AxiosPromise}
 * @constructor
 */
export function mDownload(url, params) {
  return axios({
    url: url,
    method: "get",
    params,
    responseType: "blob",
  });
}

/**
 * 上传文件
 * @param url {String} 接口地址
 * @param data {Object} 接口参数
 * @returns {AxiosPromise}
 */
export function mUpload(url, data) {
  return axios({
    url: url,
    method: "post",
    data,
    headers: {
      "Content-Type": "multipart/form-data",
    },
    timeout: 1000 * 60 * 4,
  });
}

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

import { mGet } from "@u/xhr";

const getUserInfo = (params) => mGet("/user/info", params);

export { getUserInfo };

四、使用示例

<template>
  <div class="app-container"></div>
</template>
 
<script>
import { getUserInfo } from "@i/user";
 
export default {
  name: "Users",
  components: {},
  data() {
    return {
      list: []
    };
  },
  created() {
    getUserInfo({ id: 1 }).then((res) => {
      this.list = res.data;
    });
  },
  methods: {},
};
</script>
 

 

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Vue使用axios发送请求时,可以将请求接口进行封装,以提高代码的可维护性和复用性。 首先,在Vue项目中安装Axios库: ``` npm install axios --save ``` 然后,在需要使用请求接口的地方引入axios: ``` import axios from 'axios' ``` 接下来,我们可以创建一个名为api.js的文件,用于封装请求接口。在api.js中,我们可以定义各种请求接口的方法,例如: ``` import axios from 'axios' const baseUrl = 'http://api.example.com' //接口请求基础URL export const getUserInfo = (userId) => { return axios.get(baseUrl + '/user/' + userId) } export const postUserInfo = (userInfo) => { return axios.post(baseUrl + '/user', userInfo) } export const deleteUserInfo = (userId) => { return axios.delete(baseUrl + '/user/' + userId) } ``` 在上述代码中,我们定义了三个请求接口方法,分别是获取用户信息、提交用户信息和删除用户信息。 接下来,在需要使用接口的组件中引入这些接口方法: ``` import { getUserInfo, postUserInfo, deleteUserInfo } from './api.js' ``` 然后,在组件中可以直接使用这些封装好的接口方法发送请求,例如: ``` getUserInfo(123).then(response => { //处理请求成功后返回的数据 }).catch(error => { //处理请求失败的错误 }) const userInfo = { //用户信息数据 } postUserInfo(userInfo).then(response => { //处理请求成功后返回的数据 }).catch(error => { //处理请求失败的错误 }) deleteUserInfo(123).then(response => { //处理请求成功后返回的数据 }).catch(error => { //处理请求失败的错误 }) ``` 上述代码演示了如何使用封装好的接口方法发送请求,其中.then()方法处理请求成功后返回的数据,.catch()方法处理请求失败的错误。 通过封装接口方法,我们可以将复杂的请求逻辑隐藏在api.js文件中,使组件更加清晰和简洁,提高了项目的可维护性。同时,由于接口方法已经封装好,可以在其他组件中重复使用,提高了代码的复用性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

爱宇阳

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

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

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

打赏作者

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

抵扣说明:

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

余额充值