axios适配版

该代码实现了一个基于Axios的HTTP请求管理模块,包括请求和响应拦截器,处理错误,以及定义了GET、POST、PUT、DELETE和上传文件的接口。它还考虑了开发环境和生产环境的URL切换,并对请求结果进行了数据处理。
import axios from 'axios';

import _ from 'lodash';

// import { QMessage } from 'wd-component'

import config from '@/cfgs/common';



const isdev = environment.includes('start');

// const baseURL = isdev ? '/dev' : `/${environment}`

const baseURL = '';

const timeout = 3000;



// dev / mirror / pre 环境切换域名

const getUrl = (url) =>

  isdev ? url : `${config.requestUrl[environment]}${url}`;



const codeMessage = {

  200: '服务器成功返回请求的数据。',

  201: '新建或修改数据成功。',

  202: '一个请求已经进入后台排队(异步任务)。',

  204: '删除数据成功。',

  400: '发出的请求有错误,服务器没有进行新建或修改数据的操作。',

  401: '用户没有权限(令牌、用户名、密码错误)。',

  403: '用户得到授权,但是访问是被禁止的。',

  404: '发出的请求针对的是不存在的记录,服务器没有进行操作。',

  406: '请求的格式不可得。',

  410: '请求的资源被永久删除,且不会再得到的。',

  422: '当创建一个对象时,发生一个验证错误。',

  500: '服务器发生错误,请检查服务器。',

  502: '网关错误。',

  503: '服务不可用,服务器暂时过载或维护。',

  504: '网关超时。',

};



const errorHandler = (error) => {

  const { response } = error;



  if (response && response.status) {

    // console.log(codeMessage[response.status] || response.statusText)

    // QMessage.error(codeMessage[response.status] || response.statusText)

  } else if (!response) {

    // QMessage.error('网络异常无法连接到服务器')

    // console.log('网络异常无法连接到服务器')

  }



  return response;

};



let cancelToken = axios.CancelToken;



const cancel = [];



const removePending = (config) => {

  for (let p in cancel) {

    if (cancel[p].u === config.url) {

      cancel[p].f();

    }

  }

};



// 请求拦截器 发送一个请求之前

axios.interceptors.request.use(

  (config) => {

    //在一个ajax发送前执行一下取消操作

    removePending(config);

    config.cancelToken = new cancelToken((c) => {

      cancel.push({

        f: c,

        u: config.url,

      });

    });



    // 添加 headers token

    // 这块拿不到 dva

    const token = localStorage.getItem('token');

    if (token) {

      config.headers['Authori-zation'] = `Bearer ${token}`;

    }



    return { timeout, ...config };

  },

  (error) => {

    return Promise.reject(error);

  },

);



axios.interceptors.response.use(

  (response) => {

    return response;

  },

  (error) => {

    errorHandler(error);

  },

);



function processingData(response) {

  const data = _.get(response, 'data', null);



  if (!_.get(data, 'errno', '')) {

    return data;

  } else {

    QMessage.error(data.msg);

    return {};

  }

}



// 上传

async function uploadPost(url, payload = {}, other = {}) {

  const response = await axios({

    method: 'post',

    url,

    data: payload,

    headers: {

      'Content-Type': 'application/x-www-form-urlencoded',

    },

    ...other,

  }).catch((err) => console.log(err));



  return processingData(response);

}



// url 是请求的服务器地址

// payload 参数

// other 其他参数 headers 等

async function post(url, payload = {}, other = {}) {

  const response = await axios({

    method: 'post',

    url,

    data: { ...payload },

  }).catch((err) => console.log(err));



  return processingData(response);

}



async function get(url, payload = {}, other = {}) {

  const response = await axios({

    method: 'get',

    baseURL,

    url,

    params: { ...payload },

    ...other,

  }).catch((err) => console.log(err));



  return processingData(response);

}



async function put(url, payload = {}, other = {}) {

  const response = await axios({

    method: 'put',

    baseURL,

    url,

    params: { ...payload },

    ...other,

  }).catch((err) => console.log(err));



  return processingData(response);

}



async function del(url, payload = {}, other = {}) {

  const response = await axios({

    method: 'delete',

    baseURL,

    url,

    params: { ...payload },

    ...other,

  }).catch((err) => console.log(err));



  return processingData(response);

}



export default {

  post,

  get,

  put,

  del,

  uploadPost,

};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值