vue進(jìn)階 - Axios安裝及使用

基礎(chǔ)入門文檔建議直接查看Axios中文文檔暮屡,這樣能少走很多彎路
Axios中文文檔

封裝請求

在請求或響應(yīng)被 then 或 catch 處理前攔截它們

import axios from 'axios';

// axios 配置
var instance = axios.create({
    headers:{
        'Content-Type': 'application/json',
    },
    timeout: 30000,
    baseURL: '',   //接口請求地址
})

//攔截重復(fù)請求
let pending = []; //聲明一個數(shù)組用于存儲每個ajax請求的取消函數(shù)和ajax標(biāo)識
let cancelToken = axios.CancelToken;
let removeRepeatUrl = (config) => {
    let comValue = config.method == 'get' ? qs.stringify(config.params) : qs.stringify(config.data);
    for(let p in pending){
        if(pending[p].u === config.url + '&' + config.method + '&' + comValue) { //當(dāng)前請求在數(shù)組中存在時執(zhí)行函數(shù)體
            pending[p].f();         //執(zhí)行取消操作
            pending.splice(p, 1);   //把這條記錄從數(shù)組中移除
        }
    }
}
let saveRepeatUrl = (config) =>{
    let comValue = config.method == 'get' ? qs.stringify(config.params) : qs.stringify(config.data);
    console.log(comValue)
    config.cancelToken = new cancelToken((c)=>{
        pending.push({ u: config.url + '&' + config.method + '&' + comValue, f: c });  // 自定義唯一標(biāo)識
    });
} }
}

// 添加請求攔截器
instance.interceptors.request.use(config => {
    // 在發(fā)送請求之前做些什么筒主,比如傳token
    removeRepeatUrl(config);       //在一個ajax發(fā)送前執(zhí)行一下取消操作
    saveRepeatUrl(config);         //保存請求地址
    return config
}, error => {
    // 對請求錯誤做些什么
    console.log(error) // for debug
    return Promise.reject(error);
})

// 添加響應(yīng)攔截器
instance.interceptors.response.use(response => {
    removeRepeatUrl(response.config);        //執(zhí)行取消操作,把已經(jīng)完成的請求從pending中移除
    // 對響應(yīng)數(shù)據(jù)做點什么
    const res = response.data;
    //對錯誤代碼做處理
    return response;
}, error => {
    // 對響應(yīng)錯誤做點什么
    console.log('err' + error)// for debug
    return Promise.reject(error);
});

export default instance;

/**
 * post 請求方法
 * @param url
 * @param data
 * @returns {Promise}
 */
export function post(url, data = {}) {
    return new Promise((resolve, reject) => {
        instance.post(url, data).then(response => {
            //對接口錯誤碼做處理
            resolve(response.data);
        }, err => {
            reject(err);
        })
    })
}

/**
 * get 請求方法
 * @param url
 * @param data
 * @returns {Promise}
 */
export function get(url, data = {}) {
    return new Promise((resolve, reject) => {
        instance.get(url, {
            params: data
        })
        .then(response => {
            resolve(response);
        })
        .catch(err => {
            reject(err)
        })
    })
}

/**
 * 封裝所有請求
 * @param methed
 * @param url
 * @param data 
 * @param headers
 * @returns {Promise}
 */
export function request(methed,url, data = {},headers) {
    return new Promise((resolve, reject) => {
        instance({
            method: methed || 'post',
            url:url,
            params: methed === 'get' ? data :'',
            data: methed !== 'get' ?  data :'',
            headers: headers || {'Content-Type':'application/json'},
        })
        .then(response => {
            //對接口錯誤碼做處理
            resolve(response.data);
        })
        .catch(err => {
            reject(err)
        })
    })
}

調(diào)用方式

在 main.js文件中引用
import {post} from './utils/http'
Vue.prototype.$post = post;

最好將項目所有接口請求放在一個文件中,方便管理

新建文件api.js
import {request} from './axios.js'
//用戶登錄接口
export function userLogin(data){
    return request('post','接口地址',data);
}

在其他頁面引用
import {userLogin} from './api.js'
userLogin({}).then(res=>{
    
});

axios跨域

方法一
在config的index.js文件中的dev屬性中添加一個屬性proxyTable:

proxyTable{
    '/api':{
        target:"URL",
        changeOrigin:true,
        pathRewrite:{
               '^/api':""
        }
    }
}

然后在axios里面訪問 /api/xxx 就可以成功訪問了這種方式只能本地測試環(huán)境運行碟嘴,對正式環(huán)境無效(需要配置環(huán)境生效)
方法二:CORS(跨域資源共享)方案解決的跨域問題
跨域資源共享 CORS 詳解

攔截重復(fù)請求

請看上面封裝的請求代碼(掩耳盜鈴,只是攔截了服務(wù)端的響應(yīng),但是還是發(fā)了請求X远谩!7娇狻=嵝颉)

碰到的問題:
請求并沒有真正取消,數(shù)據(jù)還是給發(fā)送到服務(wù)器了纵潦,所以取消請求不是真的取消請求徐鹤?
正常情況下客戶端發(fā)送的請求服務(wù)器是會接收到然后做處理的。而所謂的abort邀层,是指不接收請求的響應(yīng)數(shù)據(jù)而不是攔截返敬。因此某種意義上對于get類的請求
來說是有效的,但是對post類請求不行被济。
http請求是基于tcp的救赐,abort取消的是http層面的請求涧团,如果abort的時候只磷,請求已經(jīng)到達(dá)tcp層面了最終是還會到達(dá)服務(wù)器端的经磅,只是不會再接收服務(wù)端的
響應(yīng)了
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市钮追,隨后出現(xiàn)的幾起案子预厌,更是在濱河造成了極大的恐慌,老刑警劉巖元媚,帶你破解...
    沈念sama閱讀 217,406評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件轧叽,死亡現(xiàn)場離奇詭異,居然都是意外死亡刊棕,警方通過查閱死者的電腦和手機(jī)炭晒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評論 3 393
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來甥角,“玉大人网严,你說我怎么就攤上這事∴臀蓿” “怎么了震束?”我有些...
    開封第一講書人閱讀 163,711評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長当犯。 經(jīng)常有香客問我垢村,道長,這世上最難降的妖魔是什么嚎卫? 我笑而不...
    開封第一講書人閱讀 58,380評論 1 293
  • 正文 為了忘掉前任嘉栓,我火速辦了婚禮,結(jié)果婚禮上拓诸,老公的妹妹穿的比我還像新娘胸懈。我一直安慰自己,他們只是感情好恰响,可當(dāng)我...
    茶點故事閱讀 67,432評論 6 392
  • 文/花漫 我一把揭開白布趣钱。 她就那樣靜靜地躺著,像睡著了一般胚宦。 火紅的嫁衣襯著肌膚如雪首有。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,301評論 1 301
  • 那天枢劝,我揣著相機(jī)與錄音井联,去河邊找鬼。 笑死您旁,一個胖子當(dāng)著我的面吹牛烙常,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 40,145評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼蚕脏,長吁一口氣:“原來是場噩夢啊……” “哼侦副!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起驼鞭,我...
    開封第一講書人閱讀 39,008評論 0 276
  • 序言:老撾萬榮一對情侶失蹤秦驯,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后挣棕,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體译隘,經(jīng)...
    沈念sama閱讀 45,443評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,649評論 3 334
  • 正文 我和宋清朗相戀三年洛心,在試婚紗的時候發(fā)現(xiàn)自己被綠了固耘。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,795評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡词身,死狀恐怖玻驻,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情偿枕,我是刑警寧澤璧瞬,帶...
    沈念sama閱讀 35,501評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站渐夸,受9級特大地震影響嗤锉,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜墓塌,卻給世界環(huán)境...
    茶點故事閱讀 41,119評論 3 328
  • 文/蒙蒙 一瘟忱、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧苫幢,春花似錦访诱、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至哀峻,卻和暖如春涡相,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背剩蟀。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評論 1 269
  • 我被黑心中介騙來泰國打工催蝗, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人育特。 一個月前我還...
    沈念sama閱讀 47,899評論 2 370
  • 正文 我出身青樓丙号,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子犬缨,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,724評論 2 354

推薦閱讀更多精彩內(nèi)容