/**
* 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
}