vue项目axios封装post和get公共方法,并设置超时状态。包括上传图片、下载excel和预览pdf

目录

在这里插入图片描述
核心代码段

import axios from 'axios'
import qs from 'qs'

let defaultTimeout = 3*60*1000
const axios = axios.create({
  timeout: defaultTimeout, // request timeout
})
// 在响应拦截器中判断是否超时
let status = true
let timeout = null
axios.interceptors.response.use(
  response => {
    if (response.data.code === 1001) {
      status = false
      timeout = setTimeout(() => {
        status = true;
        clearTimeout(timeout);
      }, 1500)
      if(status) {
        ElMessage.warning(response.data.msg?response.data.msg: '接口异常')
      }
    }
    delete cancelHash[response.config.url]
    return response
  },
  error => {
    if (error.message.includes("timeout")) {
      ElMessage.warning('请求超时');
    }
  }
)
// 封装get方法
export function get(url, params, timeout) {
    return new Promise((resolve, reject) => {
        if (!params) {
            params = {
                timestamp: new Date().getTime()
            }
        } else {
            Object.assign(params, {
                timestamp: new Date().getTime()
            })
        }
        axios.get(url, {
            params: params,
            paramsSerializer: params => {
            // 此行代码是解决给后台传数组参数时,参数名后边多了[]的问题
                return qs.stringify(params, {indices: false})
                // 详细解析见文章paramsSerializer的使用
            },
            timeout: timeout
        }, {
            headers: {
                'Content-Type': 'application/json',
                traditional: true
            },

        }).then(res => {
            resolve(res.data)
        }).catch(err => {
            reject(err);
        })
    })
}

// post方法封装
export function post(url, params, timeout) {
    return new Promise((resolve, reject) => {
        axios.post(url, params,{timeout: timeout}, {
            headers: {
                'Content-Type': 'application/json'
            }
          })
          .then(res => {
              resolve(res.data)
          })
       .catch(err => {
             reject(err);
         })
    })
}

// post封装方法二
export function post(url, params, isJSON = false, headers = null) {
    let postParams = isJSON? JSON.stringify(params): QS.stringify(params);
    return new Promise((resolve, reject) => {
         axios.post(url, postParams, {headers: headers || {
            'Content-Type': isJSON? 'application/json;charset=UTF-8': 'application/x-www-form-urlencoded;charset=UTF-8'
        }})
        .then(res => {
            resolve(res.data);
        })
        .catch(err =>{
            reject(err.data);
        })
    });
}

// 上传图片
export function imgAxios(url, params) {
    return new Promise((resolve, reject) => {
        service.post(url, params, {
            headers: {
                'Content-Type': 'multipart/form-data' // 设置post文件的请求头
            }
        })
            .then(res => {
                resolve(res.data)
            })
            .catch(err => {
                reject(err)
            })
    })
}


// 导出excel文件
export function exportExcel(url, method, params) {
    return new Promise((resolve, reject) => {
        service.defaults.headers['content-type'] = 'application/json;charset=UTF-8'
        service({
            method: method,
            url: url, // 请求地址
            params: params&&params.options?params.options: '', // 参数
            responseType: 'blob' // 表明返回服务器返回的数据类型
        }).then(
            response => {
                resolve(response.data)
                let blob = new Blob([response.data], {
                    type: params.options.type?params.options.type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
                })
                let fileName = params?params.name:Date.parse(new Date())
                if (window.navigator.msSaveOrOpenBlob) {
                    navigator.msSaveBlob(blob, fileName)
                } else {
                    let link = document.createElement('a')
                    link.href = window.URL.createObjectURL(blob)
                    link.download = fileName
                    link.click()
                    //释放内存
                    window.URL.revokeObjectURL(link.href)
                }
                // loadingInstance.close();
            },
            err => {
                // loadingInstance.close();
                reject(err)
            }
        )
    })
}

// 预览pdf文件
export function previewPdf(url, params) {
    return new Promise((resolve, reject) => {
        service.get(url, {
            params: params,
            responseType: 'arraybuffer',//一定要设置响应类型,否则页面会是空白pdf
        }, {
            headers: {
                'Content-Type': 'application/x-www-form-urlencoded'
            }
        }).then(res => {
            resolve(res.data)
        })
            .catch(err => {
                reject(err.data)
                Message.info({message: '加载失败', type: 'error'});
            })
    })
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue 3 + TypeScript 项目中,可以通过以下步骤来封装 axios封装 get 和 post 请求: 1. 安装 axios 和 @types/axios: ``` npm install axios @types/axios ``` 2. 创建 axios 实例 在 src 目录下创建一个 api 目录,并在其中创建一个 axios.ts 文件。在该文件中创建 axios 实例: ```typescript import axios, { AxiosInstance } from 'axios' const instance: AxiosInstance = axios.create({ baseURL: 'http://your.api.url', // 根据实际情况修改接口地址 timeout: 10000, // 请求超时间 headers: { 'Content-Type': 'application/json;charset=utf-8' } }) export default instance ``` 3. 封装 get 和 post 请求 在 api 目录下创建一个 request.ts 文件,并在其中封装 get 和 post 请求: ```typescript import axios from './axios' interface ResponseData<T> { code: number; message: string; data: T; } export function get<T>(url: string, params?: any): Promise<T> { return new Promise((resolve, reject) => { axios.get<ResponseData<T>>(url, { params }).then(response => { const res = response.data if (res.code === 0) { resolve(res.data) } else { reject(res.message) } }).catch(error => { reject(error) }) }) } export function post<T>(url: string, data?: any): Promise<T> { return new Promise((resolve, reject) => { axios.post<ResponseData<T>>(url, data).then(response => { const res = response.data if (res.code === 0) { resolve(res.data) } else { reject(res.message) } }).catch(error => { reject(error) }) }) } ``` 在以上代码中,封装了一个 ResponseData 接口,该接口规定了接口返回数据的格式,包括 code、message 和 data 三个字段。封装的 get 和 post 方法返回一个 Promise 对象,resolve 返回 data 字段的值,reject 返回 message 字段的值。 4. 在组件中使用封装好的请求方法 在组件中引入封装好的请求方法,并使用: ```typescript import { defineComponent, ref } from 'vue' import { get, post } from '@/api/request' export default defineComponent({ setup() { const data = ref<any>(null) // 发起 get 请求 get<any>('/api/getData').then(res => { data.value = res }).catch(err => { console.log(err) }) // 发起 post 请求 post<any>('/api/postData', { name: '张三', age: 18 }).then(res => { console.log(res) }).catch(err => { console.log(err) }) return { data } } }) ``` 在以上代码中,使用 ref 创建了一个 data 变量,用于存储 get 请求返回的数据。在 setup 函数中调用 get 和 post 方法,并在 then 和 catch 中处理请求成功和失败的逻辑。最后将 data 变量作为组件的返回值。 这样就完成了 axios封装和 get、post 请求的封装。在组件中使用封装好的请求方法,可以让代码更加简洁易懂,并且方便统一处理请求成功和失败的逻辑。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值