前端之请求axios封装

使用前提:需要下载axios,vant

axios.js封装

//axios.js
import axios from 'axios';
import {Toast } from 'vant'; 

//添加请求拦截器
axios.interceptors.request.use(
  function(config) {
    //在发送请求之前做某事
       //携带token请求
      let token=localStorage.getItem('token')
    if (token) {
      config.headers.Authorization = 'Bearer ' + token
    }
    return config;
  },
  function(error) {
    //请求错误时做些事
    return Promise.reject(error);
  }
);

//添加响应拦截器
axios.interceptors.response.use(
  function(response) {
    //对响应数据做些事
    return response;
  },
  function(error) {
    //请求错误时做些事
    return Promise.reject(error);
  }
);


export default function formMiddlePromise(url, params, method) {
   if(method){
    method= method.toUpperCase();
  }
    method="POST"
  
  console.log(url,method,params);
  Toast.loading({
    duration: 0, // 持续展示 toast
    forbidClick: true,
    message: '加载中',
  });
  return new Promise((resolve, reject) => {
    axios({
      method: method,
      url: url,
      timeout: 60000,
      data: params,
      headers: {
        'Content-Type': 'application/json;charset=utf-8',
      },
      transformRequest: [
        function(data, headers) {
          return data;
        }
      ],
    })
      .then(
        response => {
          Toast.clear();
          resolve(response.data);
        },
        err => {
          Toast.clear();
          if (err && err.response) {
            switch (err.response.status) {
              case 400:
                err.message = '请求错误';
                Toast('请求错误');
                break;

              case 401:
                err.message = '未授权,请登录';
                Toast('未授权,请登录');
                break;

              case 403:
                err.message = '拒绝访问';
                Toast('拒绝访问');
                break;

              case 404:
                err.message = `请求地址出错: ${err.response.config.url}`;
                Toast(`请求地址出错: ${err.response.config.url}`);
                break;

              case 408:
                err.message = '请求超时';
                Toast('请求超时');
                break;

              case 500:
                err.message = '服务器内部错误';
                Toast('服务器内部错误');
                break;

              case 501:
                err.message = '服务未实现';
                Toast('服务未实现');
                break;

              case 502:
                err.message = '网关错误';
                Toast('网关错误');
                break;

              case 503:
                err.message = '服务不可用';
                Toast('服务不可用');
                break;

              case 504:
                err.message = '网关超时';
                Toast('网关超时');
                break;

              case 505:
                err.message = 'HTTP版本不受支持';
                Toast('HTTP版本不受支持');
                break;

              default:
            }
          }else{
            Toast('服务器错误,请联系管理员!!!');
          }
          reject(err);
        }
      )
      .catch(thrown => {
        Toast(thrown);
      });
  });
}

// 返回数据统一修改成小写(预防后端数据大小写不一致需要多次改代码的情况)
function convertKeysToLowercase(data) {
  if (typeof data === 'object') {
    if (Array.isArray(data)) {
      return data.map(item => convertKeysToLowercase(item));
    } else {
      const convertedData = {};
      for (let key in data) {
        if (data.hasOwnProperty(key)) {
          const lowercaseKey = key.toLowerCase();
          convertedData[lowercaseKey] = convertKeysToLowercase(data[key]);
        }
      }
      return convertedData;
    }
  } else {
    return data;
  }
}

参数处理:

请求头设置:
   1 'Content-Type': 'application/json;charset=utf-8'
      let param={
        TaxNos:TaxNos
      }
     let res=await GetMySealByTaxNo(JSON.stringify(param))
   
   2 'Content-Type': 'application/x-www-form-urlencoded'
     let param={
       TaxNos:TaxNos
     }
     let res=await GetMySealByTaxNo(this.$qs.stringify(param)) 
     注意:需要下载qs并引入main.js 
           import qs from 'qs'
           Vue.prototype.$qs = qs

api.js 

import formMiddlePromise from './axios';

let base = '请求地址';
let base='/api' //跨域请求

//登录
export const GetLoginInfo= (params, method) => {
    return formMiddlePromise(`${base}GetMySealByTaxNo`, params, method);
  };

跨域处理:

   注意:此方法仅仅适用于开发环境中

//vue.config.js
const { defineConfig } = require('@vue/cli-service')
module.exports = defineConfig({
  transpileDependencies: true,
  devServer:{
    proxy:{
      '/api':{
        target:'请求地址',
        changeOrigin:true, //允许跨域
        pathRewrite:{ //重写
          '^/api':'' //将api替换为空
        }
      }
    }
  }
})

最新版本:

   axios

/*
 * @Author: 程序媛刘刘 
 * @Date: 2024-07-16 15:33:09
 * @LastEditors: 程序媛刘刘 3232024387@qq.com
 * @LastEditTime: 2024-07-22 15:55:35
 * @Description: 
 * 
 * Copyright (c) 2024 by ${git_name_email}, All Rights Reserved. 
 */
/* eslint-disable eqeqeq */
// axios.js
import axios from 'axios'
import { CryptoAESKey } from '@/utils/JSEncrypt'
import { MessageBox } from 'element-ui'
import store from '@/store'
import {showLoading,hideLoading } from '@/utils/load'


if(process.env.NODE_ENV !== 'test'){
    axios({
      method: 'get',
      url: window.location.pathname+'/config.json',
    }).then(res=>{
      console.log('读取配置',res);
      axios.defaults.baseURL = res.data.ServeUrl;
    })
}else{
  axios.defaults.baseURL= process.env.VUE_APP_ServeUrl
}


// 添加请求拦截器
axios.interceptors.request.use(
  function (config) {
    return config
  },
  function (error) {
    // 请求错误时做些事
    showInfo('msgByAlert','提示',error.message)
    return Promise.reject(error)
  }
)

// 添加响应拦截器
axios.interceptors.response.use(
  function (response) {
    // 登录失效时使用
    //   if(response.code==''){
    //    router.replace(LOGIN_URL)
    //  }
    return response
  },
  function (error) {
    let message = ' '
    if (error && error.response) {
      switch (error.response.status) {
        case 400:
          message = '请求错误'
          break
        case 401:
          message = '未授权,请登录'
          break
        case 403:
          message = '拒绝访问'
          break
        case 404:
          message = `请求地址出错: ${error.response.config.url}`
          break
        case 408:
          message = '请求超时'
          break
        case 500:
          message = '服务器内部错误'
          break
        case 501:
          message = '服务未实现'
          break
        case 502:
          message = '网关错误'
          break
        case 503:
          message = '服务不可用'
          break
        case 504:
          message = '网关超时'
          break
        case 505:
          message = 'HTTP版本不受支持'
          break
        default:
          message = '网络连接故障'
      }
      showInfo('msgByAlert','提示',message)
    } else {
      showInfo('msgByAlert','提示',error.message)
    }
    return Promise.reject(error)
  }
)
const that = this
// 防止多次ajax请求


	
/**
 * @description: 
 * @param {*} url 请求地址 string
 * @param {*} params 请求参数 object
 * @param {*} method 请求方法 string get,post(默认),delete
 * @param {*} header 请求头 object { contentType:'from(multipart/form-data);json(application/json 默认)',
 *                                   Authorization:'', }
 * @param {*} setParam 请求参数处理 object { isEncry:true 全部使用(默认) params 仅请求参数使用 return 仅返回参数使用,
 *                                          isExtra:{额外新增参数} }
 * @param {*} setReturn 请求返回处理 object  { isLower: true 全部返回数据字母都改为小写, false 不修改 ,
                                              isUseError:true 使用返回的所有错误信息 ,false 只返回成功的数据}
 * @param {*} loadingText 请求时加载的文字内容 string
 * @return {*}
 */
export default function formMiddlePromise(url, params, method, header,setParam, setReturn,loadingText) {
showInfo('showLoading',loadingText)
  method = method.toUpperCase()||'POST'
  params = {
    ...params,
    ...setParam.isExtra
  }
  console.log( `Method:${method + '---------' + url},params:${JSON.stringify(params)}`)
 if (header.contentType == 'Form') {
    var param = new FormData()
    for (var key in params) {
      param.append(key, params[key])
    }
    params = param
  } else if(setParam.isEncry==true||setParam.isEncry=='params'){
    params = CryptoAESKey.encrypt(JSON.stringify(params))
  }else{
    params =JSON.stringify(params)
  }

  console.log( `Method:${method + '---------' + url},params:${JSON.stringify(params)}`)
  return new Promise((resolve, reject) => {
    axios({
      method: method,
      url: url,
      data: params,
      headers: {
        'Content-Type': header.contentType == 'form' ? 'multipart/form-data' : 'application/json'
      },
      responseType: 'text',
    })
      .then(
        (response) => {
          var data
          if(setParam.isEncry==true||setParam.isEncry=='return'){
            data = CryptoAESKey.decrypt(response.data)
          }else if(setParam.isEncry=='params'){
            data = response.data
          }
          data = JSON.parse(data)
          if(setReturn.isLower) data=convertKeysToLowercase(data)
          console.log(url, data)
          showInfo('hideLoading')
          if (data.Code == '0' || data.Code == 0 || data.code == 0) {
            if (setReturn.isUseError) resolve(data)
            resolve(data.data)
          } else if (data.Code == '400' || data.Code == 400 || data.code == 400) {
           showInfo('msgByAlert','提示',data.msg)
           store.commit('user/LOGOUT')
          } else {
           showInfo('msgByAlert','提示',data.msg)
            if (setReturn.isUseError) resolve(data)
          }
        },
        (error) => {
          showInfo('hideLoading')
          reject(error)
        }
      )
      .catch((thrown) => {
        showInfo('hideLoading')
        console.log('thrown',thrown);
        showInfo('msgByAlert','提示',data.msg)
      })
  })
}

/**
 * @description: 
 * @param {*} type 展示名称 showLoading显示加载框  hideLoading关闭加载框  msgByAlert alert提示
 * @param {*} title 展示标题
 * @param {*} msg  展示内容
 * @return {*}
 */
function showInfo(type,title,msg){
  switch (type){
    case 'showLoading':
      showLoading(title)
    case 'hideLoading':
      hideLoading()
    case 'msgByAlert':
      MessageBox.alert(msg, title||'提示')
  }
}

function setParamInitJson(params) {
  var param = {}
  var where = {}
  var Filters = []
 for (var i in params) {
  if (i == 'page') {
    param['page'] = params[i]
  } else if (i == 'size') {
    param['size'] = params[i]
  } else if (i == 'token') {
    param['token'] = params[i]
  } else {
    Filters.push({
      Field: i,
      Operator: 'Equals',
      Value: params[i]
     })
  }
 }
 if (JSON.stringify(Filters) != '[]') {
  where['Filters'] = Filters
  where['Logic'] = 'Or'
  param['where'] = JSON.stringify(where)
 }
 return param
}

function convertKeysToLowercase(data) {
  if (typeof data === 'object') {
    if (Array.isArray(data)) {
      return data.map(item => convertKeysToLowercase(item));
    } else {
      const convertedData = {};
      for (let key in data) {
        if (data.hasOwnProperty(key)) {
          const lowercaseKey = key.toLowerCase();
          convertedData[lowercaseKey] = convertKeysToLowercase(data[key]);
        }
      }
      return convertedData;
    }
  } else {
    return data;
  }
}

api.js

import formMiddlePromise from './axios'
const base ='/api'

// 根据图片验证码发送短信  url, params, method, header,setparam, setreturn,loadingText
export const sendMsgByImg = (params) => {
  return formMiddlePromise(`${base}/common/send/sms`, params, '', {},{},{},'')
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

程序媛刘刘

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

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

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

打赏作者

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

抵扣说明:

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

余额充值