import axios from 'axios' import qs from 'qs' import appData from './AppData'
var Http = { defaultTimeout: 20000 }
Http.ErrorCode = { NOT_NETWORK: -1, // 無網(wǎng)絡(luò),服務(wù)器無響應(yīng) SERVICE_ERROR: -2, // 服務(wù)器錯(cuò)誤,請求錯(cuò)誤返回碼不為:200 PARSER_ERROR: -3, // 接口解析錯(cuò)誤 API_ERROR: -4, // 接口錯(cuò)誤status不為:0 REQUEST_ERROR: -5 // 請求之前錯(cuò)誤, }
/** * * @param error error對象 * @param errorCode Http.ErrorCode * @param request 請求對象 * @param response 響應(yīng)對象 * @returns {*} * @constructor */ var creatHttpError = function (error, errorCode, request, response) { if (!error) { error = new Error() } error.errorCode = errorCode
if (request) { error.request = request }
if (response) { error.response = response } return error }
// 創(chuàng)建新的實(shí)例 var axiosNew = axios.create({ timeout: Http.defaultTimeout}) axiosNew.defaults.withCredentials = true
// POST傳參序列化(添加請求攔截器) axiosNew.interceptors.request.use( config => { config.headers = { // 'X-Requested-With': 'XMLHttpRequest', 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8' } // 在發(fā)送請求之前做某件事 if ( config.method === 'post' || config.method === 'put' || config.method === 'delete' ) { // 序列化 config.data = qs.stringify(config.data) } return config }, error => { let httpError = creatHttpError(error, Http.ErrorCode.REQUEST_ERROR, error.request, error.response) return Promise.reject(httpError) } )
// 返回狀態(tài)判斷(添加響應(yīng)攔截器) axiosNew.interceptors.response.use( res => { // 對響應(yīng)數(shù)據(jù)做些事 if (res.status == 200) { if (res.data.state == 0) { return res.data.data } else { // 接口state不為0
let httpError = creatHttpError(new Error('Api Error:' + res.data.data), Http.ErrorCode.API_ERROR, res.request, res) return Promise.reject(httpError) } } else { let httpError = creatHttpError(new Error('Server Error:' + res.status), Http.ErrorCode.SERVICE_ERROR, res.request, res) return Promise.reject(httpError) } }, error => { if (error.response) { // 服務(wù)器有響應(yīng) let httpError = creatHttpError(error, Http.ErrorCode.SERVICE_ERROR, error.request, error.response) return Promise.reject(httpError) } else { // 無網(wǎng)絡(luò)或者服務(wù)器無響應(yīng) let httpError = creatHttpError(error, Http.ErrorCode.NOT_NETWORK, error.request, error.response) return Promise.reject(httpError) } } )
/** this.$http.post(url,data).then((data)=>{
}).catch((error)=>{
})
* * @param url * @param data * @returns {Promise<any>} */ Http.post = function (url, data) { return new Promise(function (resolve, reject) { axiosNew.post(url, data).then(function (data) { resolve(data) }).catch(function (error) { console.log('http-post-error:', error) reject(error) }) }) }
/** this.$http.get(url,data).then((data)=>{
}).catch((error)=>{
})
* * @param url * @param data * @returns {Promise<any>} */ Http.get = function (url, params) { return new Promise(function (resolve, reject) { axiosNew.get(url, {params: params}).then(function (data) { resolve(data) }).catch(function (error) { console.log('http-get-error:', error) reject(error) }) }) }
/** * 延時(shí)請求,等下次頁面加載再去請求,跳轉(zhuǎn)頁面上報(bào)功能一般用這個(gè) * @param url * @param data */ Http.postWhenFreeTime = function (url, data) { // let requests = storage.getLocal('postWhenFreeTime',[]) // requests.push({url:url,data:data}) // storage.setLocal('postWhenFreeTime',requests)
let requests = appData.postWhenFreeTime requests.push({url: url, data: data}) }
/** * 激活上報(bào) */ Http.startPost = function () { // setTimeout(function () { // let requests = storage.getLocal('postWhenFreeTime',[]) // if(requests.length>0){ // let request = requests.shift() // storage.setLocal('postWhenFreeTime',requests) // Http.post(request.url,request.data).finally(function () { // Http.startPost() // }) // } // },1000)
setTimeout(function () { let requests = appData.postWhenFreeTime if (requests.length > 0) { let request = requests.shift() Http.post(request.url, request.data).finally(function () { Http.startPost() }) } }, 1000) }
module.exports = Http
|