请求方式配置及api设置

5 篇文章 0 订阅
/**

 * Created  on 2018/11/13.

 */

import axios from 'axios'

import utils from '@/assets/js/utils'

import iView from 'iView'

let jwtNotFound=0

/**

 * 抽象接口请求方法

 * @returns {*}

 */

window.requestList = []

export function createAPI () {

  axios.defaults.withCredentials = true

  axios.defaults.timeout = 60000

  axios.defaults.headers['deviceInfo'] = 'web'

  axios.defaults.headers['responseType'] = 'blob'

  axios.defaults.headers['Content-Type'] = 'application/json'

  let CancelToken = axios.CancelToken

  let urlList=['carrierTrendExcelSpecial','downSpecialBriefing','articleExport','navyExcel']

  axios.interceptors.request.use(res => {

    

    let config = res

    let arr = res.url.split('/')

    if ((arr.length==4&&urlList.indexOf(arr[3])>0)||(arr.length==5&&urlList.indexOf(arr[4])>0)) {

      config.timeout = 500000

    }

    if (res.url.split('/')[1]=='navy'){

      config.headers['authorization'] = utils.getCookie('AUTHENTICATE_TOKEN_navy')

    } else{

      config.headers['authorization'] = utils.getCookie('AUTHENTICATE_TOKEN')

    }

    

    config.headers['ueToken'] = utils.getCookie('ueToken')

    config.headers['Content-Type'] = 'application/json'

    config.cancelToken = new CancelToken(function(cancel) {

      window.requestList.push({

        cancelToken: cancel

      })

    })

    return config

  }, err => {

    console.log('err')

    return Promise.reject(err)

  })



  axios.interceptors.response.use(res => {

    if (res.status >= 200 && res.status < 400) {

    

      let arr=res.config.url.split('/')

      if (res.data.meta&&[3001,3002,3003].indexOf(res.data.meta.code)>=0){

        if (jwtNotFound==0){

          window.location.href = '/login'

        }

        jwtNotFound++

        return

      }

      if ((arr.length==4&&urlList.indexOf(arr[3].split('?')[0])<0)||(arr.length==5&&urlList.indexOf(arr[4])<0)) {

        if (res.data.meta.code >= 3000 && res.data.meta.code < 4000) {

          if (res.data.data.hasOwnProperty('accessToken')) {

            if (res.config.url.split('?')[0].indexOf('/navy')==0){

              utils.clearCookie('AUTHENTICATE_TOKEN_navy')

              utils.setCookie('AUTHENTICATE_TOKEN_navy', res.data.data.accessToken)

            }else{

              utils.clearCookie('AUTHENTICATE_TOKEN')

              utils.setCookie('AUTHENTICATE_TOKEN', res.data.data.accessToken)

            }

          } else if (res.config.url.split('?')[0]== '/api/article/showArticleDetailExternal'||res.config.url=='/static/ip.json'){



          } else {

            window.location.href = '/login'

            return

          }

        }

        return Promise.resolve(res.data)

      } else {

        return Promise.resolve(res)

      }

    }

    return Promise.reject(res)

  }, err => {

    if (err.message.includes('timeout')) {

      iView.Message.info('请求超时,请稍后再试')

      return Promise.reject(err);

    } else if (axios.isCancel(err)) {

      // 取消请求

      return Promise.reject(err)

    } else {

      // 处理错误

      iView.Notice.error({

        title: '系统异常',

        desc: '请稍后尝试'

      })

      return Promise.reject(err)

    }

  })



  let api = {

    /**

     * get请求

     * @param target  请求地址

     * @param params  请求参数

     * @returns {Promise}

     */

    get (target, params = {}) {

      let suffix = Object.keys(params).map(name => {

        return `${name}=${params[name]}`

      }).join('&')

      let urls = suffix.length > 0 ? `${target}?${suffix}` : `${target}`

      return new Promise((resolve, reject) => {

        axios.get(urls, params, {headers: {}}).then(res => {

          if (res.data.status === 10002) {

          } else if (res.data.status !== 0) {

            resolve(res)

          } else {

            resolve(res)

          }

        }).catch(thrown => {

          reject(thrown)

        })

      })

    },

    /**

     * post请求

     * @param target  请求地址

     * @param params  请求参数

     * @returns {Promise}

     */

    post (target, params = {}) {

      let suffix = Object.keys(params).map(name => {

        return `${name}=${params[name]}`

      }).join('&')

      let urls = suffix.length > 0 ? `${target}?${suffix}` : `${target}`

      return new Promise((resolve, reject) => {

        let urls1=urls

        axios.post(urls).then(res => {

          if (res.data.hasOwnProperty('accessToken')&&urls1.indexOf('login')<0) {

            axios.post(urls1).then(resAgain => {

              resolve(resAgain)

            }).catch((errAgain) => {

              reject(errAgain)

            })

          } else if (res.status==200){

            resolve(res.data)

          } else{

            resolve(res)

          }

        }).catch(thrown => {

          if (!axios.isCancel(thrown)) {

            // 处理错误

            reject(thrown)

          }

        })

      })

    },

    /**

     * json方式提交

     * @param target

     * @param params

     * @returns {Promise<any>}

     */

    postJSON (target, params = {}) {

      return new Promise((resolve, reject) => {

        let urls1=target

        let params1=params

        axios.post(target, params, {headers: {}}).then(res => {

          if (res.data.hasOwnProperty('accessToken')&&urls1.indexOf('login')<0) {

            axios.post(urls1,params1, {headers: {}}).then(resAgain => {

              resolve(resAgain)

            }).catch((errAgain) => {

              reject(errAgain)

            })

          } else {

            resolve(res)

          }

        }).catch((err) => {

          reject(err)

        })

      })

    },

    downloadFile (target, params = {}) {

      return new Promise((resolve, reject) => {

        // 响应类型:arraybuffer, blob

        let urls1=target

        let params1=params

        axios.post(target, params, {responseType: 'blob'}).then(res => {

          if (res.data.hasOwnProperty('accessToken')&&urls1.indexOf('login')<0) {

            axios.post(urls1,params1, {headers: {}}).then(resAgain => {

              resolve(resAgain)

            }).catch((errAgain) => {

              reject(errAgain)

            })

          } else {

            resolve(res)

          }

        }).catch(function (error) {

          reject(error)

        })

      })

    },

    download (target, params = {}) {

      return new Promise((resolve, reject) => {

        var xhr = new XMLHttpRequest()

        function getQueryString (name) {

          var reg = new RegExp('(^|&)' + name + '=([^&]*)(&|$)', 'i')

          var r = target.substr(target.indexOf('?')+1).match(reg)

          if (r != null) return unescape(r[2])

          return null

        }

        let extensionName=getQueryString('extensionName')

        let contentDisposition=getQueryString('contentDisposition')

        xhr.open('post', target)

        xhr.responseType = 'arraybuffer'

        let cookieAuthorization = utils.getCookie('AUTHENTICATE_TOKEN')

        xhr.setRequestHeader('content-type', 'application/json');

        xhr.setRequestHeader('authorization', cookieAuthorization);

        xhr.setRequestHeader('deviceInfo', 'web');

        xhr.send(JSON.stringify(params))



        xhr.onreadystatechange = function () {

          if (xhr.readyState === 4 && xhr.status === 200) {

            var contentType = xhr.getResponseHeader('content-type')

            var filename = contentDisposition+'.'+extensionName

            var blob = new Blob([xhr.response], {type: contentType})

            var csvUrl = window.URL.createObjectURL(blob)

            var link = document.createElement('a')

            link.href = csvUrl

            link.download = filename

            link.click()

            resolve(xhr.response)

          }

        }

      }).then(res =>{

        iView.Notice.success({

          title: '下载成功',

          desc: ''

        })

      })

    },

    downloadOld (target, params = {}) {

      return new Promise((resolve, reject) => {

        var xhr = new XMLHttpRequest()

        let suffix = Object.keys(params).map(name => {

          return `${name}=${params[name]}`

        }).join('&')

        let urls = suffix.length > 0 ? `${target}?${suffix}` : `${target}`

        xhr.open('post', urls)

        xhr.responseType = 'arraybuffer'

        let cookieAuthorization = utils.getCookie('AUTHENTICATE_TOKEN')

        xhr.setRequestHeader('authorization', cookieAuthorization);

        xhr.setRequestHeader('deviceInfo', 'web');

        xhr.send()



        xhr.onreadystatechange = function () {

          if (xhr.readyState === 4 && xhr.status === 200) {

            var contentType = xhr.getResponseHeader('content-type')

            var filename = params.contentDisposition

            var blob = new Blob([xhr.response], {type: contentType})

            var csvUrl = window.URL.createObjectURL(blob)

            var link = document.createElement('a')

            link.href = csvUrl

            link.download = filename

            link.click()

            resolve(xhr.response)

          }

        }

      }).then(res =>{

        iView.Notice.success({

          title: '下载成功',

          desc: ''

        })

      })

    }

  }

  return api

}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值