axios的簡單封裝和http請求實踐

對axios做一個簡單的封裝和實現(xiàn)的思路,主要實現(xiàn):

  • 統(tǒng)一捕獲接口報錯(攔截器)
  • 基礎(chǔ)驗證 (auth)

import axios from 'axios'
// 最基本的全局配置
const instance = axios.create({
    baseURL: "https://movie.douban.com/j/",
    timeout: 2500
})
// Add a request interceptor, 發(fā)送請求之前
instance.interceptors.request.use( (config) => {
    //add auth
    return config;
},  (error) => {
    return Promise.reject(error);
});
// Add a response interceptor
instance.interceptors.response.use( (response) => {
    // 返回錯誤判斷(服務(wù)器端定義的err code)
    //保存auth token
    return response;
},  (error) => {
    // 可以在后面的請求中catch
    return Promise.reject(error);
});

下面是最基本的請求:

//可以參考定義post, put, delete
const requests = {
    get: url =>
        instance.get(url)
            .then(res => {
                console.log(res)
                return res.data
            })
}

上面是基本的網(wǎng)絡(luò)配置。

接下來就可以針對不用的模塊,去發(fā)送不同的請求:

const Movies = {
    all: () => requests.get('/new_search_subjects?tags=%E4%B8%AD%E5%9B%BD&start=0')
}
export default {
    Movies,
}

如上,可以將電影模塊所有相關(guān)的網(wǎng)絡(luò)請求都放在同一個對象里面。

const click_button = () => {
    agent.Movies.all().then()
        .catch()
        .finally()
}

在組件中就可以調(diào)用如下函數(shù),進行數(shù)據(jù)處理,異常處理。finally可用作loading的取消等等。
注意:如果response有錯誤在interceptors被catch,那么后續(xù)的then將不會被調(diào)用。這個點可以用作對用戶的錯誤請求提示,而不必在每個請求后手動添加catch。

關(guān)于finally的使用:
npm install axios promise.prototype.finally --save先安裝依賴。
之后如下調(diào)用,即可使用finally。

import promiseFinally from 'promise.prototype.finally'

promiseFinally.shim();

ReactDOM.render(<App />, document.getElementById('root'));
registerServiceWorker();

各業(yè)務(wù)不同,因此只是簡寫大概,歡迎交流。

參考資料:
給axios做個挺靠譜的封裝(報錯,鑒權(quán),跳轉(zhuǎn),攔截,提示)
mobx組織實踐和http封裝組織
axios 配置finally

github:https://github.com/yunshuipiao

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。