import axios from 'axios'
import store from '@/store'
import { baseConfig } from '../../base.config'
import { refreshtokenApi } from '../pages/login/api'
import qs from 'qs'
let axiosPromiseArr = []
// 做了一個適配,在axios的外面杰扫,套了一個wx.request用于適配小程序
axios.defaults.adapter = function(config) {
return new Promise((resolve, reject) => {
var settle = require('axios/lib/core/settle') // settle操作岸梨,會額外判斷是否是合理的status狀態(tài)
var buildURL = require('axios/lib/helpers/buildURL') // url拼接方法
wx.request({
method: config.method.toUpperCase(),
url:
config.baseURL +
buildURL(config.url, config.params, config.paramsSerializer),
header: config.headers,
data: config.data,
dataType: config.dataType,
responseType: config.responseType,
sslVerify: config.sslVerify,
complete: function complete(response) {
response = {
data: response.data,
status: response.statusCode,
errMsg: response.errMsg,
header: response.header,
config: config
}
settle(resolve, reject, response)
}
})
})
}
const httpRequest = axios.create({
withCredentials: true,
crossDomain: true,
baseURL: baseConfig.baseURL,
timeout: 6000
})
httpRequest.setToken = token => {
httpRequest.defaults.headers.Authorization = token
store.commit('SET_TOKEN', token)
}
const getDataType = obj => {
let rawType = Object.prototype.toString.apply(obj)
let len = rawType.length - 1
return rawType.substring(8, len)
}
// 是否正在刷新的標記
let isRefreshing = false
// 重試隊列梯啤,每一項將是一個待執(zhí)行的函數形式
let requests = []
const instanceConf = config => {
config.cancelToken = new axios.CancelToken(cancel => {
axiosPromiseArr.push({ cancel })
})
// token
if (store.state.token) {
config.headers['Authorization'] = store.state.token
}
if (
config.method === 'post' &&
config.data &&
config.headers['Content-Type'] !== 'application/json' &&
config.headers['Content-Type'] !== 'multipart/form-data'
) {
if (getDataType(config.data) === 'Object') {
config.data = qs.stringify(config.data)
}
}
config.headers['ClientType'] = 'MINI'
config.headers['X-AUTHORIZATION'] = store.state.token
config.headers['R-AUTHORIZATION'] = store.state.refreshToken
config.headers['X-APPID'] = '1012'
config.headers['X-CLIENT-TYPE'] = 'MINI'
config.headers['X-PROJECT-UUID'] = store.state.projectUuid
return config
}
/**
* 重定向
*/
const routerRedirect = () => {
// Message.warning(`身份過期吸重,請重新登錄!`)
uni.redirectTo({
url: '/pages/login/Login'
})
}
// 請求攔截
httpRequest.interceptors.request.use(instanceConf, function(error) {
return Promise.reject(error)
})
// 響應攔截
httpRequest.interceptors.response.use(
async function(response) {
let code = (response && response.data && response.data.code) || '無code'
let whiteList = [0, 200]
if (whiteList.includes(code)) {
return response.data
} else if (code == 402) {
if (!isRefreshing) {
isRefreshing = true
try {
const {
data: { token }
} = await refreshtokenApi()
if (token) {
httpRequest.setToken(token)
response.config.headers.Authorization = token
// 已經刷新了token瑰枫,將所有隊列中的請求進行重試
requests.forEach(cb => cb(token))
requests = []
return httpRequest(instanceConf(response.config))
}
} catch (error) {
//刷新時候直接判斷token 不用判斷code
console.error('refreshtoken error =>', error)
routerRedirect()
} finally {
isRefreshing = false
}
} else {
// 正在刷新token确沸,將返回一個未執(zhí)行resolve的promise
return new Promise(resolve => {
// 將resolve放進隊列饭尝,用一個函數形式來保存利虫,等token刷新后直接執(zhí)行
requests.push(token => {
response.config.headers.Authorization = token
resolve(httpRequest(instanceConf(response.config)))
})
})
}
} else if (
[
401,
10005,
500000,
500001,
500002,
500003,
500004,
600000,
600001,
150000,
100001,
20003
].includes(code)
) {
routerRedirect()
}
return Promise.reject(response.data)
},
function(error) {
console.log(error.response, 'seee')
if (error && error.response && error.response.status === 401) {
routerRedirect()
}
if (error && error.message) {
if (error.message === 'timeout of 10000ms exceeded') {
return Promise.reject(error)
}
if (
error.response &&
error.response.status === 500 &&
error.response.data.msg === '服務器內部錯誤'
) {
return Promise.reject(error)
}
return new Promise(() => {})
}
console.log(error, 'sssssssssssssssssssssssssssssssss')
return Promise.reject(error)
}
)
export { httpRequest, axiosPromiseArr }
小程序中的axios封裝請求
最后編輯于 :
?著作權歸作者所有,轉載或內容合作請聯系作者
- 文/潘曉璐 我一進店門壤躲,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人您炉,你說我怎么就攤上這事柒爵。” “怎么了赚爵?”我有些...
- 正文 為了忘掉前任窝剖,我火速辦了婚禮麻掸,結果婚禮上,老公的妹妹穿的比我還像新娘赐纱。我一直安慰自己脊奋,他們只是感情好熬北,可當我...
- 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著诚隙,像睡著了一般讶隐。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上久又,一...
- 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼适瓦!你這毒婦竟也來了竿开?” 一聲冷哼從身側響起,我...
- 正文 年R本政府宣布袁串,位于F島的核電站,受9級特大地震影響呼巷,放射性物質發(fā)生泄漏囱修。R本人自食惡果不足惜,卻給世界環(huán)境...
- 文/蒙蒙 一王悍、第九天 我趴在偏房一處隱蔽的房頂上張望破镰。 院中可真熱鬧,春花似錦、人聲如沸鲜漩。這莊子的主人今日做“春日...
- 文/蒼蘭香墨 我抬頭看了看天上的太陽孕似。三九已至瓶佳,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間鳞青,已是汗流浹背。 一陣腳步聲響...
推薦閱讀更多精彩內容
- // 網絡請求文件request.jsclass Axios { constructor(config) { ...
- web 如有不合理地方根據需求修改 axios攔截器封裝 請求封裝使用 小程序 (uni-app 其他封裝也類似 ...
- <a>§ 封裝網絡請求及 mock 數據</a> 本文配套視頻地址:https://v.qq.com/x/page...