vue封装axios的方式

Posted Cxymds

tags:

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

vue封装axios的方式(三)

与第二种封装基本相同,不同之处在于api的处理格式

// 引入axios
import axios from \'axios\'
// 引入qs模块,对数据进行序列化
import QS from \'qs\'
// 引入message模块,toast提示
import  message  from \'ant-design-vue\'
// 引入storage模块,操作token
import  session  from \'@/utils/storage.js\'

// 请求超时时间
axios.defaults.timeout = 10000

// 请求拦截器
axios.interceptors.request.use(
  config => 
    // 每次发送请求之前判断是否存在token,如果存在,则统一在http请求的header都加上token,不用每次请求都手动添加了
    // 即使本地存在token,也有可能token是过期的,所以在响应拦截器中要对返回状态进行判断
    const token = session.get(\'Token\')
    token && (config.headers.Authorization = token)
    if(config.method.toUpperCase() === \'POST\') 
      config.headers[\'Content-Type\'] = \'application/json;charset=utf-8\'
    
    return config
  ,
  error => 
    return Promise.error(error)
  )
// 响应拦截器
axios.interceptors.response.use(
  response => 
    console.log(response)
    if (response.status === 200) 
      return Promise.resolve(response)
     else 
      return Promise.reject(response)
    
  ,
  // 服务器状态码不是200的情况
  error => 
    if (error.response.status) 
      switch (error.response.status) 
        case 500:
          message.error(\'网错错误,请稍后再试!\')
          break
        case 404:
          message.error(\'网错错误,请稍后再试!\')
          break
        // 其他错误,直接抛出错误提示
        default:
          message.error(error.response.data.message)
      
      return Promise.reject(error.response)
    
  
)

/**
 * get方法,对应get请求
 * @param String url [请求的url地址]
 * @param Object params [请求时携带的参数]
 */
export function get(url, params) 
  return new Promise((resolve, reject) =>
    axios.get(url, 
      params: params
    )
      .then(res => 
        resolve(res.data)
      )
      .catch(err => 
        reject(err.data)
      )
  )

/**
* post方法,对应post请求
* @param String url [请求的url地址]
* @param Object params [请求时携带的参数]
*/
export function post(url, params) 
  return new Promise((resolve, reject) => 
    axios.post(url, QS.stringify(params))
      .then(res => 
        resolve(res.data)
      )
      .catch(err => 
        reject(err.data)
      )
  )

/**
 * get方法,对应get请求,直接在地址后面拼串的形式
 * @param String url [请求的url地址]
 * @param String params [请求时携带的参数]
 */
export function getDynamicynamic(url, params) 
  return new Promise((resolve, reject) =>
    const completeUrl = `$url/$params`
    axios.get(completeUrl, )
      .then(res => 
        resolve(res.data)
      )
      .catch(err => 
        reject(err.data)
      )
  )

/**
 * post方法,导出文件
 * @param String url [请求的url地址]
 * @param String params [请求时携带的参数]
 */
export function getFileUseBlobByPost(url, params = ) 
	return new promise((resolve, reject)=> 
		axios(
	      method: \'post\',
	      url,
	      data: params,
	      responseType: \'blob\'
	    )
	      .then(res => 
	        resolve(res)
	      )
	      .catch(err => 
	        reject(err.data)
	      )
		)

创建单独的api模块

import  get, post, getDynamicynamic, getFileUseBlobByPost  from \'./http\'

export const testPostApi = p => post(\'test1/api/login\', p)

export const testGetDynamicApi = p => getDynamicynamic(\'test3/api/getnew\', p)

export const testGetApi = p => get(\'demo2/api/goods\', p)

export const testExportApi = p => getFileUseBlobByPost(\'demo1/api/export\', p)

页面中的使用

<script setup >
import  onMounted  from \'vue\'
import  testPostApi, testGetApi, testGetDynamicApi  from \'@/request/api.js\'

const testPostFun = async () => 
  const res = await testPostApi( username: \'admin\', password: \'admin\' )
  console.log(res)

const testGetFun = async () => 
  const res = await testGetApi()
  console.log(res)

const testGetDynamicFun = async () => 
  const res = await testGetDynamicApi(\'15\')
  console.log(res)

const testexportFun = async () => 
  const res = await testExportApi()
  console.log(res)
  const fileName = decodeURIComponent(res.headers[\'content-disposition\'].split(\';\')[1]).split(\'=\')[1].split(\'"\')[1]
  let url = window.URL.createObjectURL(new Blob([res.data]))
  let a = document.createElement(\'a\')
  a.style.display = \'none\'
  a.href = url
  a.setAttribute(\'download\', fileName)
  document.body.appendChild(a)
  a.click() //执行下载
  window.URL.revokeObjectURL(a.href) //释放url
  document.body.removeChild(a) //释放标签

onMounted(() => 
  testPostFun()
  testGetFun()
  testGetDynamicFun()
  testexportFun()
)
</script>

vue.config.js的参考配置

const  defineConfig  = require(\'@vue/cli-service\')
module.exports = defineConfig(
  transpileDependencies: true,
  devServer: 
    proxy: 
      \'/test1\': 
        target: \'http://www.liulongbin.top:3007/\',
        pathRewrite:  \'^/test1\': \'\' ,
        ws: false,
        changeOrigin: true
      ,
      \'/demo2\': 
        target: \'https://www.escook.cn/\',
        pathRewrite:  \'^/demo2\': \'\' ,
        ws: false,
        changeOrigin: true
      ,
      \'/test3\': 
        target: \'http://www.liulongbin.top:3005/\',
        pathRewrite:  \'^/test3\': \'\' ,
        ws: false,
        changeOrigin: true
      
    
  
)

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

Vue--封装axios跨域

vue项目中axios的封装

vue2小知识实现axios的二次封装

vue搭建项目之设置axios

vue 封装propmise 第一种 -----axios封装---api资源管理

Vue第九天学习笔记之网络模块封装