Vue中Axios配置不同的baseURL,請求不同的域名接口方式
最近使用 Vue2.0開發(fā)項目,開發(fā)過程遇到一個問題,由于項目需要拆分成多個小的模塊,接口地址來源不一致。每個模塊有不同的接口地址。而模塊之間公用的接口就出現(xiàn)在同一項目請求多個接口地址問題。
于是在網(wǎng)上看了問題解決辦法,都不太實用,所以在這里記錄一下我的解決辦法,各個項目差異性導致每個項目有不同間距辦法,這里的辦法供參考。。。。
Vue2.0項目中Axios配置不同的baseURL,請求不同的域名接口
準備工作1
準備一個utls.js 文件(路徑自己存放,我放到@/config/api中)
// 導出 對應的不同接口的URL地址
const configUrl = {
Base_store_URL: 'http://store.xxx.com', //模塊一接口地址
Base_api2_URL: 'http://api.xxx.com', //模塊二接口地址
}
export default configUrl準備工作2
準備一個公用的request.js文件,并導入的apiUrl.js接口路徑文件中(import request from ‘@/utils/request’)
import axios from 'axios'
import $store from '@/store'
import router from '../router'
import baseUrl from '@/config/api'
//const baseUrl = 'http://api2.65ph.com'
// const instance = axios.create({
// // baseURL: 'http://api2.test.com',
// timeout: 5000,
// // withCredentials:true
// })
const defaultOpt = { login: true }
let that = this
function baseRequest (options) {
let instance = '';
if(!options) return false
switch(options.urlType){
case 'api':
instance = axios.create({
baseURL: baseUrl.Base_store_URL,
timeout: 5000,
withCredentials:true
})
break;
default:
instance = axios.create({
baseURL: baseUrl.Base_api2_URL,
timeout: 5000,
withCredentials:true
})
}
axios.defaults.withCredentials = true
const token = $store.state.app.token
// console.log(token)
const headers = options.headers || {}
headers['Authorization'] = token
// headers["Authori-zation"] = "Bearer" + token
options.headers = headers
// 判斷未登錄
if (options.login && !token) {
// qudengl
toLogin()
return Promise.reject({ msg: '未登錄', toLogin: true })
}
// console.log(options)
return instance(options).then(res => {
const data = res.data || {}
if (res.status !== 200)
return Promise.reject({ msg: "請求失敗", res, data })
if ([410000, 410001, 410002].indexOf(data.status) !== -1) {
// 去登錄
toLogin()
return Promise.reject({ msg: res.data.msg, res, data, toLogin: true })
}else if (data.status === 200) {
return Promise.resolve(data, res)
} else {
return Promise.reject({ msg: res.data.msg, res, data })
}
})
}
/**
* http 請求基礎類
* 參考文檔 https://www.kancloud.cn/yunye/axios/234845
*
*/
const request = ["post", "put", "patch"].reduce((request, method) => {
/**
*
* @param url string 接口地址
* @param data object get參數(shù)
* @param options object axios 配置項
* @param urlType object axios 請求接口路徑域名區(qū)分
* @returns {AxiosPromise}
*/
request[method] = (url, data = {}, options = {},urlType) => {
return baseRequest(
Object.assign({ url, data, method ,urlType}, defaultOpt, options)
);
};
return request;
}, {});
["get", "delete", "head"].forEach(method => {
/**
*
* @param url string 接口地址
* @param params object get參數(shù)
* @param options object axios 配置項
* @param urlType object axios 請求接口路徑域名區(qū)分
* @returns {AxiosPromise}
*/
request[method] = (url, params = {}, options = {}, urlType) => {
return baseRequest(
Object.assign({ url, params, method, urlType }, defaultOpt, options)
);
};
});
export default request
在接口文件中這樣傳參
import request from '@/utils/request'
export function getZbData (page) {
return request.get('index/zbxm', {page: page}, { login: false })
}
/**
* 文章列表
* @returns {*}
* api 我們判斷模塊的參數(shù)
*/
export function getArticleList(q, cid) {
return request.get("/api/article/list/" + cid, q, { login: false },'api');
}我們調用接口時這樣使用
import { getArticleList} from '@/api/public'
// 在methods中
// 文章列表
get_article_list(){
let that = this
let q = {
page: that.page,
limit: that.limit
};
getArticleList(q,that.cid).then(res=>{
that.$set(that,'articleList',res.data)
})
},Vue3.0項目中Axios配置不同的baseURL,請求不同的域名接口
其他地方都和上述相同,只要
準備工作2
準備一個公用的request.js文件中的用法有差異
import axios from 'axios'
import { Message } from 'iview'
import { getCookies, removeCookies } from '@/libs/util'
import Setting from '@/setting'
import {toLogin} from './login'
import baseUrl from '@/config/api'
const service = axios.create({
// baseURL: Setting.apiBaseURL,
timeout: 10000, // 請求超時時間
// withCredentials:true
})
// 請求攔截器
service.interceptors.request.use(
config => {
// console.log(config)
// console.log('============================')
switch(config.urlType){
case 'api':
config.url = baseUrl.Base_store_URL + config.url
break;
default:
config.url = baseUrl.Base_api2_URL + config.url
}
const token = getCookies('login_status')
if (token) {
// config.headers['Authori-zation'] = token
config.headers['Authorization'] = token
}
console.log(config)
return config
},
error => {
// do something with request error
return Promise.reject(error)
}
)
axios.defaults.withCredentials = true// 攜帶cookie
// response interceptor
service.interceptors.response.use(
response => {
let status = response.data ? response.data.status : 0
const code = status
console.log('狀態(tài)',code)
switch (code) {
case 200:
return response.data
case 400:case 400011:case 400012:
return Promise.reject(response.data || { msg: '未知錯誤' })
case 410000:
case 410001:
case 410002:
toLogin()
break
default:
break
}
},
error => {
Message.error(error.msg)
return Promise.reject(error)
}
)
export default service
使用時
/**
* 文章詳情
* @returns {*}
*/
export function getarticle(id) {
return request({
url: '/api/article/details/' + id,
method: 'get',
params: '',
urlType: 'api'
})
// return request.get("/api/article/details/" + id, {}, { login: false },'api');
}總結
優(yōu)點:
1.在不同的組件調用不同的方法就可以實現(xiàn),不同的接口請求數(shù)據(jù);
2.維護接口方便,以后上線之后,把api.js中的接口全部更換成線上接口即可;
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
vue 彈窗時 監(jiān)聽手機返回鍵關閉彈窗功能(頁面不跳轉)
這篇文章主要介紹了vue 彈窗時 監(jiān)聽手機返回鍵關閉彈窗功能,本文給大家介紹的非常詳細,具有一定的參考借鑒價值(頁面不跳轉) ,需要的朋友可以參考下2019-05-05
Vue+Ant Design進行大數(shù)據(jù)量下拉框卡頓與表單提交優(yōu)化
在現(xiàn)代前端開發(fā)中,處理大數(shù)據(jù)量渲染和表單交互是常見的挑戰(zhàn),本文將探討如何優(yōu)化 Ant Design Vue 下拉框在大數(shù)據(jù)量情況下的性能問題,并解決表單提交后重復提示的問題,需要的可以了解下2025-03-03

