uniapp使用axios無(wú)法請(qǐng)求的解決辦法:首先在根目錄新建一個(gè)【axios.js】文件,在該文件中配置一個(gè)新的axios;然后使用這個(gè)適配器并設(shè)置重新發(fā)起請(qǐng)求的次數(shù)以及每次重新請(qǐng)求的間隔時(shí)間。
本教程操作環(huán)境:windows7系統(tǒng)、uni-app2.5.1版本,該方法適用于所有品牌電腦。
推薦(免費(fèi)):uni-app開發(fā)教程
uniapp使用axios無(wú)法請(qǐng)求的解決辦法:
在根目錄新建一個(gè)axios.js文件,在該文件中配置一個(gè)新的axios
import axios from "axios"; const service = axios.create({ withCredentials: true, crossDomain: true, baseURL: '***', timeout: 6000 })
在根目錄建一個(gè)lib文件夾,在這個(gè)文件夾里建一個(gè)adapter.js文件,該文件配置了基于uniapp的axios適配,記得拋出這個(gè)適配器
import settle from "axios/lib/core/settle" import buildURL from "axios/lib/helpers/buildURL" /* 格式化路徑 */ const URLFormat = function (baseURL, url) { return url.startsWith("http") ? url : baseURL } /* axios適配器配置 */ const adapter = function (config) { return new Promise((resolve, reject) => { uni.request({ method: config.method.toUpperCase(), url: buildURL(URLFormat(config.baseURL, 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); } }) }) } export default adapter;
在根目錄的axios.js文件中,使用這個(gè)適配器并設(shè)置重新發(fā)起請(qǐng)求的次數(shù)以及每次重新請(qǐng)求的間隔時(shí)間
import adapter from "./lib/adapter" service.defaults.adapter = adapter; service.defaults.retry = 5; // 設(shè)置請(qǐng)求次數(shù) service.defaults.retryDelay = 1000;// 重新請(qǐng)求時(shí)間間隔
設(shè)置一個(gè)請(qǐng)求完成后的攔截器,如果響應(yīng)頭中的狀態(tài)碼為200表示成功,將請(qǐng)求得到的數(shù)據(jù)返回,否則一律視為錯(cuò)誤請(qǐng)求,需要返回一個(gè)Promise。在lib中建立一個(gè)axiosError.js在里面處理失敗的請(qǐng)求。
service.interceptors.response.use(res => { if (res.status == 200) { return res; } else { return Promise.reject(res); } }, err => axiosError(err, service))
axiosError.js中需要傳入axios攔截器截到的錯(cuò)誤以及我們新創(chuàng)建的這個(gè)axios,這個(gè)錯(cuò)誤處理頁(yè)面只是充當(dāng)一個(gè)分配器的角色,我們可以根據(jù)響應(yīng)頭中的狀態(tài)進(jìn)行處理該錯(cuò)誤,未處理的錯(cuò)誤在使用時(shí)處理,返回Promise.reject
// 處理401錯(cuò)誤代碼 import Error401 from "../handlers/401Error"; export default function (err, axios) { const errStatus = err.response.status; if (errStatus == 401) { return Error401(err); // 401沒有權(quán)限,重新請(qǐng)求設(shè)置token } else { return Promise.reject(err); } }
處理401錯(cuò)誤代碼,當(dāng)請(qǐng)求失敗并且響應(yīng)頭中的狀態(tài)碼為401時(shí),是我沒沒有權(quán)限去請(qǐng)求,可以根據(jù)項(xiàng)目來(lái)進(jìn)行處理,我們是需要攜帶token,所以401為token未攜帶或失效,請(qǐng)求時(shí)無(wú)需傳入token,axios遇到401會(huì)自動(dòng)攜帶這個(gè)token重新去請(qǐng)求。在根目錄建一個(gè)handlers文件夾,在里面建一個(gè)401Error.js用于處理401的錯(cuò)誤。
這里使用到Vuex,需要引入Vuex,因?yàn)楂@取token、設(shè)置token的方法以及token都放在里面!?。∈褂胹tore.dispatch("getToken")得到token后將token設(shè)置到請(qǐng)求頭Authorization
import interceptorsError from "../lib/interceptorsError"; import store from 'store/index' /* 需要傳入axios錯(cuò)誤配置 */ export default function (err, axios) { const config = err.config;// axios請(qǐng)求配置 store.dispatch("getToken").then(function () { config.headers["Authorization"] = store.state.cnrToken.cnr_token; }); err.config = config; return interceptorsError(axios, config); }
一切準(zhǔn)備就緒之后需要重新請(qǐng)求,在根目錄建一個(gè)interceptorsError.js文件,用于重新執(zhí)行請(qǐng)求,這個(gè)方法需要一個(gè)請(qǐng)求配置,只需要把我們上一個(gè)請(qǐng)求的配置傳入即可。
export default function (axios, config) { // 如果配置不存在或未設(shè)置重試選項(xiàng),reject if (!config || !config.retry) return Promise.reject(err); // 設(shè)置變量以跟蹤重試計(jì)數(shù) config.__retryCount = config.__retryCount || 0; // 如果重試次數(shù)大于最大重試次數(shù),reject if (config.__retryCount >= config.retry) { return Promise.reject(err); } // 每重試一次記錄一次重試次數(shù) config.__retryCount += 1; // 重試間隔時(shí)間 const backoff = new Promise(function (resolve) { setTimeout(function () { resolve(); }, config.retryDelay || 1000); }); return backoff.then(function () { return axios(config); }); }
這是我Vuex中的代碼
/* * @Author: UpYou * @Date: 2020-09-25 16:30:13 * @LastEditTime: 2020-09-25 21:32:56 * @Descripttion: token * */ const state = { cnr_token: '', POST_KEYS: { ...獲取token需要的驗(yàn)證信息... } }; const mutations = { /* 設(shè)置token */ SET_CNRTOKEN(state, Payload) { if (Payload.startsWith("Bearer")) state.cnr_token = Payload; else state.cnr_token = "Bearer" + Payload; } } const actions = { /* 向服務(wù)器獲取token */ getToken(context, args) { return new Promise(function (resolve, reject) { uni.request({ url: "token服務(wù)器地址", data: { ...context.state.POST_KEYS }, method: "get", async success(res) { await context.commit('SET_CNRTOKEN', res.data.access_token) await resolve(res.data) }, fail: reject }); }) } } export default { state, mutations, actions, }