詳解axios中封裝使用、攔截特定請(qǐng)求、判斷所有請(qǐng)求加載完畢)
•基于 Promise 的 HTTP 請(qǐng)求客戶端,可同時(shí)在瀏覽器和 Node.js 中使用
•vue2.0之后,就不再對(duì) vue-resource 更新,而是推薦使用 axios,本項(xiàng)目也是使用 axios
•功能特性
•在瀏覽器中發(fā)送 XMLHttpRequests 請(qǐng)求
•在 node.js 中發(fā)送 http請(qǐng)求
•支持 Promise API
•攔截請(qǐng)求和響應(yīng)
•轉(zhuǎn)換請(qǐng)求和響應(yīng)數(shù)據(jù)
•取消請(qǐng)求
•自動(dòng)轉(zhuǎn)換 JSON 數(shù)據(jù)
•客戶端支持保護(hù)安全免受 CSRF/XSRF(跨站請(qǐng)求偽造) 攻擊
封裝使用
建議拆分三個(gè)文件
•src
-> service
---->axios.js (axios 配置,攔截器、統(tǒng)一 url)
---->index.js (接口方法,里面調(diào)用 api 方法,供頁(yè)面級(jí)調(diào)用)
---->api
------->index.js(api 方法,里面調(diào)用后端提供的接口,供接口方法調(diào)用)
axios.js 基本配置
'use strict';
import axios from 'axios';
// 自動(dòng)識(shí)別接口使用開發(fā)環(huán)境地址(開發(fā)環(huán)境地址做了 proxyTable 代理,故設(shè)置為空)或線上地址
axios.defaults.baseURL = process.env.NODE_ENV === 'production' ? process.env.API_ROOT : '';
// 開發(fā)環(huán)境直接打包測(cè)試
// axios.defaults.baseURL = '';
axios.interceptors.request.use(config => {
return config;
}, error => {
console.log(error);
return Promise.reject(error);
});
axios.interceptors.response.use(res => {
const apiRes = res.data;
return apiRes;
}, async error => {
console.dir(error);
return Promise.reject(error);
});
export default axios;
api/index.js 調(diào)用后端提供的接口
import Ax from '@/service/axios';
import qs from 'qs';
export default {
fetchBlog (reqData) {
return Ax.get('/krryblog/blog/getBlog', {params: reqData});
},
addBlog (reqData) {
return Ax.post('/krryblog/blog/addBlog', qs.stringify(reqData));
},
updateBlog (reqData) {
return Ax.post('/krryblog/blog/updateBlog', qs.stringify(reqData));
},
deleteBlogCover (id, reqData) {
return Ax.post(`/krryblog/blog/deleteBlogCover/${id}`, qs.stringify(reqData));
},
};
index.js 接口方法(調(diào)用 api)
import Api from './api';
export async function getBlog(reqData) {
let res = await Api.fetchBlog(reqData);
return res;
},
export async function addBlog (reqData) {
let res = await Api.addBlog(reqData);
return res;
},
export async function updateBlog (reqData) {
let res = await Api.updateBlog(reqData);
return res;
},
export async function deleteBlogCover (id, reqData) {
let res = await Api.deleteBlogCover(id, reqData);
return res;
},
頁(yè)面調(diào)用
接下來(lái)就可以愉快地在頁(yè)面調(diào)用了
import { getBlog } from '@/service'
export default {
data() {
return {
tableData: [],
pageIndex: 1,
pageSize: 9
}
},
created() {
this.getList();
},
methods: {
async getList() {
let { result } = await getBlog({
pageIndex: this.pageIndex,
pageSize: this.pageSize
});
this.tableData = result.data;
},
}
axios 執(zhí)行多個(gè)并發(fā)請(qǐng)求
async getList() {
let resArr = []
for (let val of this.arrId) {
// push 請(qǐng)求
resArr.push(queryPropertyValue({ id: val }))
}
this.tableData = []
Promise.all(resArr).then(res => {
for (let val of res) {
let vals = val.result.propertyValues
// 每個(gè)請(qǐng)求的結(jié)果 push 到 tableData
vals.forEach(item => this.tableData.push(item))
}
})
},
或者直接在 axios 寫 promise all
// 根據(jù) id 獲取某一條商品數(shù)據(jù)
let getDetail = (id)=>{
return axios.get(`/detail?bid=${id}`);
}
// 檢測(cè)登錄的用戶是否將此商品加入購(gòu)物車
let detectCar = (shopId,userId)=>{
return axios.get(`/detectCar?shopId=${shopId}&userId=${userId}`);
}
// 獲取一條商品數(shù)據(jù)、并且檢測(cè)是否加入購(gòu)物車
let getDeAll = (shopId,userId)=>{
axios.all([
getDetail(shopId),
detectCar(shopId,userId)
]).then(axios.spread((resDetail, resCar)=>{
// 兩個(gè)請(qǐng)求現(xiàn)已完成
// 打印兩個(gè)請(qǐng)求的響應(yīng)值
console.log(resDetail);
console.log(resCar);
}));
}
•實(shí)例的方法
axios#request(config) axios#get(url [,config]) axios#delete(url [,config]) axios#head(url [,config]) axios#post(url [,data [,config]]) axios#put(url [,data [,config]]) axios#patch(url [,data [,config]])
•請(qǐng)求配置:只有url是必需的,如果未指定方法,請(qǐng)求將默認(rèn)為GET
axios 攔截特定請(qǐng)求
業(yè)務(wù)上經(jīng)常出現(xiàn)這個(gè)問(wèn)題,需要攔截某些特定請(qǐng)求,在該特定請(qǐng)求,頁(yè)面采取或不采取什么變化
研究 axios 的 request 統(tǒng)一攔截方法:axios.interceptors.request.use(function (config) {})
參數(shù) config 如下:
可以發(fā)現(xiàn) config.url 就是請(qǐng)求的接口的地址,那么 “/” 最后的 getClassify 就是該請(qǐng)求的方法,就可以通過(guò)取出該字符串來(lái)判斷某些特定請(qǐng)求,從而做出怎樣的變化
axios.interceptors.request.use(config => {
// 判斷請(qǐng)求是否是 getClassify,如果是 getClassify,不加載 LoadingBar
let url = config.url;
if (url.split('/').pop() === 'getClassify') {
flag = false;
} else {
iView.LoadingBar.start();
flag = true;
}
return config;
}, error => {
console.log(error);
return Promise.reject(error);
});
如何判斷所有請(qǐng)求加載完畢
let reqNum = 0
axios.interceptors.request.use(function (config) {
// 在請(qǐng)求發(fā)出之前進(jìn)行一些操作,每次發(fā)出請(qǐng)求就 reqNum++
reqNum++
_bus.$emit('showloading')
return config
}
axios.interceptors.response.use(response => {
// 接受請(qǐng)求后 reqNum--,判斷請(qǐng)求所有請(qǐng)求是否完成
reqNum--
if (reqNum <= 0) {
_bus.$emit('closeLoading')
} else {
_bus.$emit('showloading')
}
})
axios 的 post 請(qǐng)求 相關(guān)問(wèn)題
•如果遇到 post 請(qǐng)求跨域問(wèn)題,在 webpack 配置文件可以設(shè)置 proxyTable 處理跨域問(wèn)題
•傳送門:https://ainyi.com/27
•post 請(qǐng)求攜帶參數(shù),需要做一次序列化:qs.stringify(reqData)
saveNormalAds (reqData) {
return Ax.post('/index.php?krry', qs.stringify(reqData));
},
總結(jié)
以上所述是小編給大家介紹的詳解axios中封裝使用、攔截特定請(qǐng)求、判斷所有請(qǐng)求加載完畢),希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)歡迎給我留言,小編會(huì)及時(shí)回復(fù)大家的!
相關(guān)文章
bootstrap fileinput完整實(shí)例分享
這篇文章主要為大家分享文件上傳組件bootstrap fileinput完整實(shí)例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-11-11
js實(shí)現(xiàn)圖片區(qū)域可點(diǎn)擊大小隨意改變(適用移動(dòng)端)代碼實(shí)例
這篇文章主要介紹了js實(shí)現(xiàn)圖片區(qū)域可點(diǎn)擊大小隨意改變(適用移動(dòng)端)代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-09-09
使用javascript訪問(wèn)XML數(shù)據(jù)的實(shí)例
使用javascript訪問(wèn)XML數(shù)據(jù)的實(shí)例...2006-12-12
JavaScript 聯(lián)動(dòng)的無(wú)限級(jí)封裝類,數(shù)據(jù)采用非Ajax方式,隨意添加聯(lián)動(dòng)
JavaScript 聯(lián)動(dòng)的無(wú)限級(jí)封裝類,數(shù)據(jù)采用非Ajax方式,隨意添加聯(lián)動(dòng)2010-06-06
JavaScript股票的動(dòng)態(tài)買賣規(guī)劃實(shí)例分析下篇
這篇文章主要介紹了JavaScript對(duì)于動(dòng)態(tài)規(guī)劃解決股票問(wèn)題的真題例舉講解。文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-08-08
JS操作時(shí)間 - UNIX時(shí)間戳的簡(jiǎn)單介紹(必看篇)
下面小編就為大家?guī)?lái)一篇JS操作時(shí)間 - UNIX時(shí)間戳的簡(jiǎn)單介紹(必看篇)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-08-08

