vue axios的封装

Posted 西门夜说

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了vue axios的封装相关的知识,希望对你有一定的参考价值。

在根目录上创建一个vue.config.js文件

const path = require("path");
const resolve = function(dir) {
    return path.join(__dirname, dir);
};
module.exports = {
    publicPath: "./",
    outputDir: "dist",
    assetsDir: "static",
    lintOnSave: false, // 是否开启eslint保存检测
    productionSourceMap: false, // 是否在构建生产包时生成sourcdeMap
    chainWebpack: config => {
        config.resolve.alias
            .set("@", resolve("src"))
            .set("@", resolve("src/views"))
            .set("@", resolve("src/components"))
            .set("@", resolve("src/common"))
            .set("@", resolve("src/utils"))
            .set("@", resolve("src/service")); /* 别名配置 */
        config.optimization.runtimeChunk("single");
    },
    devServer: {
        // host: "localhost",
        /* 本地ip地址 */
        host: "localhost",
        port: "10000",
        hot: true,
        /* 自动打开浏览器 */
        open: true,
        overlay: {
            warning: false,
            error: true
        },
        /* 跨域代理 */
        proxy: {
            "/item": {
                /* 目标代理服务器地址 */
                target: "http://localhost:80", //localhost:80/api/item/category/list
                /* 允许跨域 */
                changeOrigin: true,
                ws: true,
                pathRewrite: {
                    "^/item": ""
                }
            }
        }
    }
};

  

 

 在api.js里面配置

import Vue from \'vue\'
import modules from \'@/api\'

const api = {
//实例化axios  用$api代替
  install(Vue) {
    Vue.prototype.$api = modules
    Vue.$api = modules
  },
  $api: modules
}

Vue.use(api)

  在axios.js

import axios from \'axios\'
import printLog from \'./log\'

//创建axios实例
const fetch = axios.create({
  baseURL:\'/api\',
  timeout: 15000
})

// 修改 axios 实例默认配置
fetch.defaults.headers.post[\'Content-Type\'] = \'application/json\'
fetch.defaults.headers.put[\'Content-Type\'] = \'application/json\'
fetch.defaults.headers.patch[\'Content-Type\'] = \'application/json\'

//request拦截器
fetch.interceptors.request.use(
  config =>{
    if (config.method === \'get\') {
      if (config.params === undefined) {
        config.params = {}
      }
      config.params = {
        ...config.params,
        ...(config.params.filter
          ? {
          filter: JSON.stringify(config.params.filter)
          }
          :{})
      }
    }
    printLog({ config })
    return config
  },
  error =>{
    //网络没建立成功
   window.console.error(error)
    return Promise.reject(error)
  }
)

//response拦截器
fetch.interceptors.response.use(
  response =>{
    printLog({ response })
    if (response.status === 200) {
      return checkResponseCode(response)
    } else {
      //window.console.log(response)
    }
  },
  error => {
    //后台服务异常  404 504 请求超时等
    //window.console.err(error, error.response, error.message)
    return Promise.reject(error.response)
  }
)

const checkResponseCode = response => {
 switch (response.data.code) {
   case 0:
     return Promise.reject(response.data)

   case 404:
     return Promise.reject(response.data)
 }
}

export default fetch

  request.js

import axios from \'axios\'
//创建axios实例
const service = axios.create({
  baseURL: \'/api\',
  timeout: 15000 //请求超出时间
})

//请求拦截
service.interceptors.request.use(
  config => {
    return config
  },
  error => {
    return Promise.reject(error)
  }
)

//响应拦截
service.interceptors.response.use(
  response=>{
    const { code, msg, data } = response.data
    if (code === 0) {
      return data
    } else {
      return promptError(code,msg,response.data)
    }
  },
  error => {
    const { status, statusText, data } = error.response
    return promptError(status, data.msg || statusText, error.response)

  }
)

/**
 * 提示错误
 * @param CODE 错误码
 * @param MSG 错误提示
 * @param REJECT reject 内容
 * @returns {Promise<never>}
 */
const promptError = (CODE, MSG, REJECT) => {
  //错误描述
  return Promise.reject(REJECT)
}
export { service as axios}

在api文件夹下的index.js

const files = require.context(\'.\', false, /\\.js$/)
let modules = {}

files.keys().forEach(key => {
  if (key === \'./index.js\') return
  modules = { ...modules, ...files(key) }
})

export default modules

 在user.js封装统一的请求 

import { axios } from \'@/utils/axios/request\'

//登录
export const login = data => {
  return axios.post(\'/v1/user/login\', data)
}
  //如果配置了 pathRewrite 需要在路径之前加上重写的
  /*
例
 pathRewrite:{
           \'^/api\': \'\'
        }

这里的请求就需要写成
export const login = data => {
  return axios.post(\'/api/v1/user/login\', data)
}
*/
//注册
export const register = data => {
  return axios.post(\'/v1/user/register\', data)
}

//提交信息采集表
export const enrollment = data => {
  return axios.post(\'/v1/enrollment/post\', data)
}

  log.js

export default ({ config, response }) => {
  const debug = true
  if (debug) {
    // 请求
    if (config) {
      window.console.groupCollapsed(`%c[${config.method}]`, \'color:#ffb400\', config.baseURL + config.url)
      // console.log(\'%c[Content-Type]\', \'color:#ffb400\', config.method, config.headers[config.method][\'Content-Type\'])
      // console.log(\'%c[X-Access-Token]\', \'color:#ffb400\', config.headers[\'X-Access-Token\'])
      if (config.method === \'get\' || config.method === \'delete\') {
        window.console.log(\'%c[params]\', \'color:#ffb400\', config.params)
      } else {
        window.console.log(\'%c[data]\', \'color:#ffb400\', config.data)
      }
      window.console.dir(config)
      window.console.groupEnd()
    }

    // 响应
    if (response) {
      if (response.data.code === 0) {
      window.console.groupCollapsed(`%c[响应成功]`, \'color:#27ae60\', response.config.url)
      window.console.log(\'%c[data]\', \'color:#ffb400\', response.data.data)
      window.console.dir(response.data)
      window.console.groupEnd()
      } else {
      window.console.group(`%c[响应错误]`, \'color:#e1514c\', response.config.url)
      window.console.log(\'%c[code]\', \'color:#e1514c\', response.data.code)
      window.console.log(\'%c[msg]\', \'color:#e1514c\', response.data.msg)
      window.console.groupEnd()
      }
    }
  }
}

  

非常感谢https://me.csdn.net/weixin_43893437对我的帮助。

以上是关于vue axios的封装的主要内容,如果未能解决你的问题,请参考以下文章

VSCode自定义代码片段14——Vue的axios网络请求封装

回归 | js实用代码片段的封装与总结(持续更新中...)

vue_cli封装axios--完整代码

vue axios 封装解析

vue中axios请求成功了如何把数据渲染到页面上?

把axios封装为vue插件使用