zoukankan      html  css  js  c++  java
  • axios 封装及取消请求

    axios通用function封装 start

    • http.js
    • 引入了移动端 vant 框架
    • 注:接口地址,加密秘钥,签名方式 根据实际情况而定适当修改
    import axios from 'axios';
    import md5 from 'md5';
    import Vue from 'vue';
    import { Toast,Dialog } from 'vant';
    Vue.use(Toast);
    Vue.use(Dialog);
    
    import vm from '@/main.js'
    import appconfig from "./appconfig";
    
    var app = {};
    app.host = appconfig.host;
    app.fileHost = appconfig.upload_host;
    
    
    //实例化 axios;
    const myHttp = axios.create({
        baseURL: app.host,
        timeout: 15000,
        headers: {'Content-Type': 'application/json;charset=UTF-8'}
    });
    
    // 请求时候拦截器;发送数据之前处理的内容;
    myHttp.interceptors.request.use((config) => {
        return config;
    }, (err) => {
        return Promise.reject(err,'拦截器错误');
    });
    
    
    /**
      var CancelToken = axios.CancelToken;
      var source = CancelToken.source();
      取消请求; 接口传入source  source.cancel(); 就可以取消发出的请求了;
      @param url  地址
      @param type  请求类型;
      @param d     参数 object
      @param loadingtext  loading 提示文字;
      @param source   取消令牌token;
     */
    app.http = (url,type,d,loadingtext,source) => {
        if(!d){
            return Promise.reject(d);
        }
        if(loadingtext){
            Toast.loading({
                message: loadingtext,
                forbidClick: false,
                duration:9000,
            });
        }
        let key = "秘钥字符串";
        let time = Math.floor((new Date()).getTime());
        let dataStr = JSON.stringify(d);
    
        let apisign = md5(key + time + dataStr);
        let userinfo = Vue.prototype.getCookie('userinfo');
    
        if(userinfo == null || userinfo == "" || userinfo == undefined){
            userinfo = {token:'',uid:''};
        }else{
            userinfo = JSON.parse(userinfo);
        }
        let token = userinfo.token||'';
        let uid = userinfo.uid||'';
        let appHead = {
            'uid':uid||0,
            'token':token||'',
            'sign':apisign||'',
            'version':1,
            'source':'android',
            'area':'CN',
            'time':time,
        };
    
        return myHttp({
            method:type,
            url: "/app"+url,
            data: d,
            cancelToken: source.token,
            headers:{appHead:JSON.stringify(appHead),'Content-Type':'application/json;charset=UTF-8'},
            timeout:15000,
    
        });
    };
    
    // 上传图片到阿里云
    app.ImgUpload = (url, type, d,loadingtext,source)=>{
        if(!d){
            return Promise.reject(d);
        }
        if(loadingtext){
            Toast.loading({
                message: loadingtext||'上傳中...',
                forbidClick: false,
                duration:9000,
            });
        }
        let key = "秘钥字符串";
        let time = Math.floor((new Date()).getTime());
        let dataStr = '';
    
        let apisign = md5(key + time + dataStr);
        let userinfo = Vue.prototype.getCookie('userinfo');
    
        if(userinfo == null || userinfo == "" || userinfo == undefined){
            userinfo = {token:'',uid:''};
        }else{
            userinfo = JSON.parse(userinfo);
        }
        let token = userinfo.token||'';
        let uid = userinfo.uid||'';
        let appHead = {
            'uid':uid||0,
            'token':token||'',
            'sign':apisign||'',
            'version':1,
            'source':'android',
            'area':'CN',
            'time':time,
        };
    
        return myHttp({
            method:type,
            url: app.fileHost+"/app"+url+"?folder=kangtai",
            data: d,
            cancelToken: source?source.token:"", // 每次请求取消凭证;
            headers:{appHead:JSON.stringify(appHead),'Content-Type':'application/json;charset=UTF-8'},
            timeout:15000,
        });
    }
    
    
    // 响应时候拦截器;
    myHttp.interceptors.response.use((response) => {
        vm.$toast.clear();
        // 对响应的数据再做什么处理; 判断登录是否失效,判断其他错误;
        if(response.status == 500){
            console.log(response.status);
        }
        else if(response.status >= 400){
            console.log(response.status);
        }
        else if(response.status >= 300){
            console.log(response.status);
        }
        else if(response.status == 200){
            return response.data;
        }
        else{
            console.log(response.status);
        }
    
    }, (err) => {
        vm.$toast.clear();
        if (axios.isCancel(err)) {
            console.log('取消本次请求', err.message); // err.message 是调用 source.cancel('取消成功'); 传入的参数
            return Promise.reject(err);
        } else {
            return Promise.reject(err);
        }
    });
    
    export default app
    
    

    axios通用function封装 end


    外部 页面调用 start

    // 以上传图片为例
    afterRead(files){
      var that = this;    
      var fmData  = new FormData()
      fmData.append('files',files.file)
      fmData.append('folder','test')
      console.log(fmData);
      // 生成 取消 令牌
      let CancelToken = axios.CancelToken;
      let source = CancelToken.source();
      this.source = source;
    
      app2.ImgUpload("/oss/imgs",'post',fmData,'上傳中...',source)
      .then(res=>{
         if(res.status == 1){
    	  console.log(res.data);
    	  this.$toast({message:res.info});
          }else{
    	  this.$toast({message:res.info});
          }
       })
       .catch(err=>{
           console.log(err);
       });
    
        // 一秒后直接取消上传
       setTimeout(()=>{
           this.source.cancel('取消请求'); // 参数可选
       },1000)
          
    }
    
    

    外部 页面调用 end

  • 相关阅读:
    力扣算法题—070爬楼梯
    力扣算法题—069x的平方根
    力扣算法题—068文本左右对齐
    天梯杯 L2-008. 最长对称子串
    CODE[VS] 1294 全排列
    hdu 1829 A Bug's Life(并查集)
    HDU 1213 How Many Tables
    POJ 1182 食物链(经典并查集) (多组输入有时乱加也会错!)
    天梯杯 L2-010. 排座位
    The Suspects POJ1611
  • 原文地址:https://www.cnblogs.com/kgwei520blog/p/13428094.html
Copyright © 2011-2022 走看看