動(dòng)態(tài)Axios的配置步驟詳解
前言
以前寫Vue項(xiàng)目的時(shí)候都是使用vue-resource做為項(xiàng)目ajax庫(kù),在11月份的某一天尤大微博的更新表示ajax的庫(kù)應(yīng)該是通用的,放棄了對(duì)vue-resource的技術(shù)支持,推薦使用axios。
推薦使用Vue-cli工具來(lái)創(chuàng)建和管理項(xiàng)目,就算剛開(kāi)始不熟悉,用著用著便可知曉其中的奧妙。前一段時(shí)間官方所推薦的數(shù)據(jù)請(qǐng)求插件還是Vue-resource,但現(xiàn)在已經(jīng)變了,變成了Axios,不用知道為什么變了,反正這個(gè)用起來(lái)比那個(gè)好一些,用就是了,下面是一些封裝axios請(qǐng)求的一些經(jīng)驗(yàn),不對(duì)之處,還望多多指教!
方法如下
一、創(chuàng)建文件,Vue項(xiàng)目初始化之后,在src目錄下再創(chuàng)建一個(gè)util工具文件夾,一般就是用來(lái)存放一些封裝的函數(shù)方法,現(xiàn)在讓我們?cè)趗til文件目錄下創(chuàng)建一個(gè)http.js文件,封裝axios方法。
二、直接上代碼(常規(guī)版),代碼中有詳細(xì)的注釋
import axios from 'axios' //引用axios
import {Promise} from 'es6-promise' //引入Promise
// axios 配置
axios.defaults.timeout = 5000; //設(shè)置超時(shí)時(shí)間
axios.defaults.baseURL = 'http://localhost:4000/api/v1/'; //這是調(diào)用數(shù)據(jù)接口
// http request 攔截器(所有發(fā)送的請(qǐng)求都要從這兒過(guò)一次),通過(guò)這個(gè),我們就可以把token傳到后臺(tái),我這里是使用sessionStorage來(lái)存儲(chǔ)token等權(quán)限信息和用戶信息,若要使用cookie可以自己封裝一個(gè)函數(shù)并import便可使用
axios.interceptors.request.use(
config => {
const token = sessionStorage.getItem("token"); //獲取存儲(chǔ)在本地的token
config.data = JSON.stringify(config.data);
config.headers = {
'Content-Type':'application/json' //設(shè)置跨域頭部,雖然很多瀏覽器默認(rèn)都是使用json傳數(shù)據(jù),但咱要考慮IE瀏覽器。
};
if (token) {
config.headers.Authorization = "Token " + token; //攜帶權(quán)限參數(shù)
}
return config;
},
err => {
return Promise.reject(err);
}
);
// http response 攔截器(所有接收到的請(qǐng)求都要從這兒過(guò)一次)
axios.interceptors.response.use(
response => {
//response.status===401是我和后臺(tái)約定的權(quán)限丟失或者權(quán)限不夠返回的狀態(tài)碼,這個(gè)可以自己和后臺(tái)約定,約定返回某個(gè)自定義字段也是可以的
if(response.status == 401) {
router.push({ //push后面是一個(gè)參數(shù)對(duì)象,可以攜帶很多參數(shù),具體可以去vue-router上查看,例如query字段表示攜帶的參數(shù)
path: '/login'
})
}
return response;
},
error => {
return Promise.reject(error.response.data)
});
export default axios;
/**
* fetch 請(qǐng)求方法
* @param url
* @param params
* @returns {Promise}
*/
export function fetch(url, params = {}) {
return new Promise((resolve, reject) => {
axios.get(url, {
params: params
})
.then(response => {
resolve(response.data);
})
.catch(err => {
reject(err)
})
})
}
/**
* post 請(qǐng)求方法
* @param url
* @param data
* @returns {Promise}
*/
export function post(url, data = {}) {
return new Promise((resolve, reject) => {
axios.post(url, data)
.then(response => {
resolve(response.data);
}, err => {
reject(err);
})
})
}
/**
* patch 方法封裝
* @param url
* @param data
* @returns {Promise}
*/
export function patch(url, data = {}) {
return new Promise((resolve, reject) => {
axios.patch(url, data)
.then(response => {
resolve(response.data);
}, err => {
reject(err);
})
})
}
/**
* put 方法封裝
* @param url
* @param data
* @returns {Promise}
*/
export function put(url, data = {}) {
return new Promise((resolve, reject) => {
axios.put(url, data)
.then(response => {
resolve(response.data);
}, err => {
reject(err);
})
})
}
三、(動(dòng)態(tài)版),axios的攔截器不是必要的,不是每個(gè)項(xiàng)目都需要,而且headers里面的Content-Type和Authorization不止一種,這時(shí)就需要使用另一種方法。
util/http.js
import axios from 'axios' //引用axios
import {Promise} from 'es6-promise' //引入Promise
// axios 配置和攔截器都不用了,這里我使用了一個(gè)動(dòng)態(tài)配置數(shù)據(jù)請(qǐng)求地址,在App.vue中,代碼在下面,這個(gè)也不是必須的。
//^_^下面都設(shè)置一個(gè)默認(rèn)的頭部,使用的時(shí)候可以傳入數(shù)據(jù)覆蓋^_^,例如使用fetch(GET)方法時(shí),沒(méi)有請(qǐng)求數(shù)據(jù),但是請(qǐng)求頭有變化,則應(yīng)寫成 fetch("地址", {}, {"這里寫頭部的內(nèi)容"}) 記住沒(méi)數(shù)據(jù)用一個(gè)空對(duì)象占位置
/**
* fetch 請(qǐng)求方法
* @param url
* @param params
* @returns {Promise}
*/
export function fetch(url, params = {}, headers = {
'Content-Type': 'application/json', //設(shè)置跨域頭部
"Authorization": 'JWT ' + sessionStorage.getItem("authToken")
}) {
return new Promise((resolve, reject) => {
axios.get(url, {
params: params,
headers: headers
})
.then(response => {
resolve(response.data);
})
.catch(err => {
reject(err.response)
})
})
}
/**
* post 請(qǐng)求方法
* @param url
* @param data
* @returns {Promise}
*/
export function post(url, data = {}, config = {
"headers": {
'Content-Type': 'application/json', //設(shè)置跨域頭部
"Authorization": 'JWT ' + sessionStorage.getItem("authToken")
}
}) {
return new Promise((resolve, reject) => {
axios.post(url, data, config)
.then(response => {
resolve(response.data);
}, err => {
reject(err.response);
})
})
}
/**
* patch 方法封裝
* @param url
* @param data
* @returns {Promise}
*/
export function patch(url, data = {}, config = {
"headers": {
'Content-Type': 'application/json', //設(shè)置跨域頭部
"Authorization": 'JWT ' + sessionStorage.getItem("authToken")
}
}) {
return new Promise((resolve, reject) => {
axios.patch(url, data, config)
.then(response => {
resolve(response.data);
}, err => {
reject(err.response);
})
})
}
/**
* put 方法封裝
* @param url
* @param data
* @returns {Promise}
*/
export function put(url, data = {}, config = {
"headers": {
'Content-Type': 'application/json', //設(shè)置跨域頭部
"Authorization": 'JWT ' + sessionStorage.getItem("authToken")
}
}) {
return new Promise((resolve, reject) => {
axios.put(url, data, config)
.then(response => {
resolve(response.data);
}, err => {
reject(err.response);
})
})
}
App.vue(這是在src目錄下的程序入口文件)
<template>
<div id="app">
<router-view/>
</div>
</template>
<script>
import axios from 'axios';
let protocol = window.location.protocol; //協(xié)議
let host = window.location.host; //主機(jī)
let reg = /^localhost+/;
if(reg.test(host)) {
//若本地項(xiàng)目調(diào)試使用
axios.defaults.baseURL = 'http://10.0.xx.xxx:xxxx/api/';
} else {
//動(dòng)態(tài)請(qǐng)求地址
axios.defaults.baseURL = protocol + "http://" + host + "/api/";
}
axios.defaults.timeout = 30000;
export default {
name: 'app',
axios //這里記得導(dǎo)出,若請(qǐng)求地址永久固定一個(gè),則就按照`普通版`配置一個(gè)baserURL就可以了
}
</script>
<style lang="scss"> //這里我使用的是scss
@import '~@/style/style'
</style>
總結(jié)
常見(jiàn)問(wèn)題
在使用動(dòng)態(tài)版時(shí),為什么稱為動(dòng)態(tài)呢,是因?yàn)樵L問(wèn)地址和請(qǐng)求地址是同一個(gè)地址可端口號(hào),例如我通過(guò)http://www.cmgos.com(默認(rèn)端口80)訪問(wèn)項(xiàng)目,那么我的baseURL會(huì)自動(dòng)的變?yōu)閔ttp:www.cmgos.com:80/api/,這么做的原因是當(dāng)某一天項(xiàng)目遷移或者h(yuǎn)ttp改為https時(shí),不用你再去更改請(qǐng)求地址,程序自動(dòng)就完成了
數(shù)據(jù)請(qǐng)求地址配置不正確?如果你配置了baseURL,那么你封裝的函數(shù)在使用時(shí)僅需傳入基于baseURL的請(qǐng)求地址,例如傳入login/那么請(qǐng)求地址會(huì)自動(dòng)變?yōu)閔ttp:www.cmgos.com:80/api/login/,若未配置,那么可以直接傳入整個(gè)請(qǐng)求地址
注意事項(xiàng)
在使用動(dòng)態(tài)版時(shí),由于沒(méi)有使用攔截器,所以下面封裝的函數(shù)在返回錯(cuò)誤的時(shí)候需要寫成err.response.data來(lái)獲取返回的數(shù)據(jù),但我寫的是err.response,因?yàn)檫@樣可以拿到(status)狀態(tài)碼等信息,若不需要判斷返回的狀態(tài)碼,則改為err.response.data便可
好了,以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
相關(guān)文章
vue使用路由守衛(wèi)實(shí)現(xiàn)菜單的權(quán)限設(shè)置
我們使?vue-element-admin前端框架開(kāi)發(fā)后臺(tái)管理系統(tǒng)時(shí),?般都會(huì)涉及到菜單的權(quán)限控制問(wèn)題,下面這篇文章主要給大家介紹了關(guān)于vue使用路由守衛(wèi)實(shí)現(xiàn)菜單的權(quán)限設(shè)置的相關(guān)資料,需要的朋友可以參考下2023-06-06
使用Vue中 v-for循環(huán)列表控制按鈕隱藏顯示功能
這篇文章主要介紹了使用Vue中 v-for循環(huán)列表控制按鈕隱藏顯示功能,需要的朋友可以參考下2019-04-04
vue實(shí)現(xiàn)前端拖拽div位置交換的方法詳解
這篇文章主要介紹了如何使用Vue技術(shù)實(shí)現(xiàn)一個(gè)簡(jiǎn)單的備忘錄應(yīng)用,包括添加條目和拖拽條目?jī)蓚€(gè)功能,文章還詳細(xì)解釋了如何使用Vue的draggable屬性和JavaScript獲取同級(jí)元素節(jié)點(diǎn)的方法,需要的朋友可以參考下2025-01-01
Vue自定義指令學(xué)習(xí)及應(yīng)用詳解
這篇文章主要為大家詳細(xì)介紹了Vue中自定義指令的學(xué)習(xí)以及如何利用Vue制作一個(gè)簡(jiǎn)單的學(xué)生信息管理系統(tǒng),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-05-05
使用sessionStorage解決vuex在頁(yè)面刷新后數(shù)據(jù)被清除的問(wèn)題
localStorage沒(méi)有時(shí)間期限,除非將它移除,sessionStorage即會(huì)話,當(dāng)瀏覽器關(guān)閉時(shí)會(huì)話結(jié)束,有時(shí)間期限,具有自行百度。本文使用的是sessionStorage解決vuex在頁(yè)面刷新后數(shù)據(jù)被清除的問(wèn)題,需要的朋友可以參考下2018-04-04
vue-cli構(gòu)建項(xiàng)目下使用微信分享功能
這篇文章主要介紹了vue-cli構(gòu)建項(xiàng)目下使用微信分享功能,本文通過(guò)實(shí)例代碼相結(jié)合的形式給大家介紹的非常詳細(xì),感興趣的朋友跟隨腳本之家小編一起學(xué)習(xí)吧2018-05-05
vue3動(dòng)態(tài)路由解決刷新頁(yè)面空白或跳轉(zhuǎn)404問(wèn)題
這篇文章主要為大家詳細(xì)介紹了vue3如何通過(guò)動(dòng)態(tài)路由解決刷新頁(yè)面空白或跳轉(zhuǎn)404問(wèn)題,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解下2025-01-01
解決vue項(xiàng)目運(yùn)行提示W(wǎng)arnings while compiling.警告的問(wèn)題
這篇文章主要介紹了解決vue項(xiàng)目運(yùn)行提示W(wǎng)arnings while compiling.警告的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-09-09
vue如何監(jiān)聽(tīng)對(duì)象或者數(shù)組某個(gè)屬性的變化詳解
這篇文章主要給大家介紹了關(guān)于vue如何監(jiān)聽(tīng)對(duì)象或者數(shù)組某個(gè)屬性的變化,在Vue.js中可以通過(guò)watch監(jiān)聽(tīng)屬性變化并動(dòng)態(tài)修改其他屬性的值,watch通過(guò)監(jiān)聽(tīng)器函數(shù)接收新舊值,實(shí)現(xiàn)屬性間的數(shù)據(jù)聯(lián)動(dòng),需要的朋友可以參考下2024-12-12
vue+el-table點(diǎn)擊表頭實(shí)現(xiàn)改變其當(dāng)前樣式
這篇文章主要介紹了vue+el-table點(diǎn)擊表頭實(shí)現(xiàn)改變其當(dāng)前樣式問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-08-08

