成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

axios基于常見業(yè)務(wù)場景的二次封裝

JasinYip / 1717人閱讀

摘要:是一個(gè)基于的庫,可以用在瀏覽器和中。我在最近的幾個(gè)項(xiàng)目中都有使用,并基于根據(jù)常見的業(yè)務(wù)場景封裝了一個(gè)通用的服務(wù)。業(yè)務(wù)場景全局請求配置。請求攜帶,權(quán)限錯(cuò)誤統(tǒng)一管理。

axios

axios 是一個(gè)基于 promise 的 HTTP 庫,可以用在瀏覽器和 node.js 中。
在前端框架中的應(yīng)用也是特別廣泛,不管是vue還是react,都有很多項(xiàng)目用axios作為網(wǎng)絡(luò)請求庫。
我在最近的幾個(gè)項(xiàng)目中都有使用axios,并基于axios根據(jù)常見的業(yè)務(wù)場景封裝了一個(gè)通用的request服務(wù)。

業(yè)務(wù)場景:

全局請求配置。

get,post,put,delete等請求的promise封裝。

全局請求狀態(tài)管理。

取消重復(fù)請求。

路由跳轉(zhuǎn)取消當(dāng)前頁面請求。

請求攜帶token,權(quán)限錯(cuò)誤統(tǒng)一管理。

默認(rèn)配置

定義全局的默認(rèn)配置

axios.defaults.timeout = 10000 //超時(shí)取消請求
axios.defaults.headers.post["Content-Type"] = "application/json;charset=UTF-8"
axios.defaults.baseURL = process.env.BASE_URL //掛載在process下的環(huán)境常量,在我另一篇文章有詳細(xì)說明

如何定義多環(huán)境常量

自定義配置(非常見業(yè)務(wù)場景,僅作介紹)

// 創(chuàng)建實(shí)例時(shí)設(shè)置配置的默認(rèn)值
var instance = axios.create({
  baseURL: "https://api.another.com"
});
// 在實(shí)例已創(chuàng)建后修改默認(rèn)值
instance.defaults.headers.common["Authorization"] = AUTH_TOKEN;

優(yōu)先級:自定義配置 > 默認(rèn)配置

請求及響應(yīng)攔截器

請求攔截器及取消重復(fù)請求

// 請求列表
const requestList = []
// 取消列表
const CancelToken = axios.CancelToken
let sources = {}
axios.interceptors.request.use((config) => {
  //將請求地址及參數(shù)作為一個(gè)完整的請求
  const request = JSON.stringify(config.url) + JSON.stringify(config.data)
  config.cancelToken = new CancelToken((cancel) => {
    sources[request] = cancel
  })
  //1.判斷請求是否已存在請求列表,避免重復(fù)請求,將當(dāng)前請求添加進(jìn)請求列表數(shù)組;
  if(requestList.includes(request)){
    sources[request]("取消重復(fù)請求")
  }else{
    requestList.push(request)
    //2.請求開始,改變loading狀態(tài)供加載動畫使用
    store.dispatch("changeGlobalState", {loading: true})
  }
  //3.從store中獲取token并添加到請求頭供后端作權(quán)限校驗(yàn)
  const token = store.getters.userInfo.token
  if (token) {
    config.headers.token = token
  }
  return config
}, function (error) {
  return Promise.reject(error)
})

1.請求攔截器中將所有請求添加進(jìn)請求列表變量,為取消請求及l(fā)oading狀態(tài)管理做準(zhǔn)備;當(dāng)請求列表已存在當(dāng)前請求則不響應(yīng)該請求。
2.請求一旦開始,就可以開啟動畫加載效果。
3.用戶登錄后可以在請求頭中攜帶token做權(quán)限校驗(yàn)使用。

響應(yīng)攔截器

axios.interceptors.response.use(function (response) {
  // 1.將當(dāng)前請求中請求列表中刪除
  const request = JSON.stringify(response.config.url) + JSON.stringify(response.config.data)
  requestList.splice(requestList.findIndex(item => item === request), 1)
  // 2.當(dāng)請求列表為空時(shí),更改loading狀態(tài)
  if (requestList.length === 0) {
    store.dispatch("changeGlobalState", {loading: false})
  }
  // 3.統(tǒng)一處理權(quán)限認(rèn)證錯(cuò)誤管理
  if (response.data.code === 900401) {
    window.ELEMENT.Message.error("認(rèn)證失效,請重新登錄!", 1000)
    router.push("/login")
  }
  return response
}, function (error) {
  // 4.處理取消請求
  if (axios.isCancel(error)) {
    requestList.length = 0
    store.dispatch("changeGlobalState", {loading: false})
    throw new axios.Cancel("cancel request")
  } else {
    // 5.處理網(wǎng)絡(luò)請求失敗
    window.ELEMENT.Message.error("網(wǎng)絡(luò)請求失敗", 1000)
  }
  return Promise.reject(error)
})

1.響應(yīng)返回后將相應(yīng)的請求從請求列表中刪除
2.當(dāng)請求列表為空時(shí),即所有請求結(jié)束,加載動畫結(jié)束
3.權(quán)限認(rèn)證報(bào)錯(cuò)統(tǒng)一攔截處理
4.取消請求的處理需要結(jié)合其他代碼說明
5.由于項(xiàng)目后端并沒有采用RESTful風(fēng)格的接口請求,200以外都?xì)w為網(wǎng)絡(luò)請求失敗

promise封裝
const request = function (url, params, config, method) {
  return new Promise((resolve, reject) => {
    axios[method](url, params, Object.assign({}, config)).then(response => {
      resolve(response.data)
    }, err => {
      if (err.Cancel) {
        console.log(err)
      } else {
        reject(err)
      }
    }).catch(err => {
      reject(err)
    })
  })
}

const post = (url, params, config = {}) => {
  return request(url, params, config, "post")
}

const get = (url, params, config = {}) => {
  return request(url, params, config, "get")
}
//3.導(dǎo)出cancel token列表供全局路由守衛(wèi)使用
export {sources, post, get}

1.axios cancel token API
2.存入需要取消的請求列表導(dǎo)出給導(dǎo)航守衛(wèi)使用
3.路由發(fā)生變化的時(shí)候取消當(dāng)前頁面還沒有返回結(jié)果的請求,在復(fù)雜的頁面中請求可能會有很多個(gè),增加取消請求的功能可以讓頁面切換的時(shí)候不卡頓。
/src/router.js

...
import { sources } from "../service/request"
...
router.beforeEach((to, from, next) => {
  document.title = to.meta.title || to.name
    //路由發(fā)生變化時(shí)取消當(dāng)前頁面網(wǎng)絡(luò)請求
  Object.keys(sources).forEach(item => {
    sources[item]("取消前頁面請求")
  })
  for (var key in sources) {
    delete sources[key]
  }
  next()
})
request.js完整代碼:

// 引入網(wǎng)絡(luò)請求庫 https://github.com/axios/axios

import axios from "axios"
import store from "../store"
import router from "../router"

// 請求列表
const requestList = []
// 取消列表
const CancelToken = axios.CancelToken
let sources = {}

// axios.defaults.timeout = 10000
axios.defaults.headers.post["Content-Type"] = "application/json;charset=UTF-8"

axios.defaults.baseURL = process.env.BASE_URL

axios.interceptors.request.use((config) => {
  const request = JSON.stringify(config.url) + JSON.stringify(config.data)

  config.cancelToken = new CancelToken((cancel) => {
    sources[request] = cancel
  })

  if(requestList.includes(request)){
    sources[request]("取消重復(fù)請求")
  }else{
    requestList.push(request)
    store.dispatch("changeGlobalState", {loading: true})
  }

  const token = store.getters.userInfo.token
  if (token) {
    config.headers.token = token
  }

  return config
}, function (error) {
  return Promise.reject(error)
})

axios.interceptors.response.use(function (response) {
  const request = JSON.stringify(response.config.url) + JSON.stringify(response.config.data)
  requestList.splice(requestList.findIndex(item => item === request), 1)
  if (requestList.length === 0) {
    store.dispatch("changeGlobalState", {loading: false})
  }
  if (response.data.code === 900401) {
    window.ELEMENT.Message.error("認(rèn)證失效,請重新登錄!", 1000)
    router.push("/login")
  }
  return response
}, function (error) {
  if (axios.isCancel(error)) {
    requestList.length = 0
    store.dispatch("changeGlobalState", {loading: false})
    throw new axios.Cancel("cancel request")
  } else {
    window.ELEMENT.Message.error("網(wǎng)絡(luò)請求失敗", 1000)
  }
  return Promise.reject(error)
})

const request = function (url, params, config, method) {
  return new Promise((resolve, reject) => {
    axios[method](url, params, Object.assign({}, config)).then(response => {
      resolve(response.data)
    }, err => {
      if (err.Cancel) {
        console.log(err)
      } else {
        reject(err)
      }
    }).catch(err => {
      reject(err)
    })
  })
}

const post = (url, params, config = {}) => {
  return request(url, params, config, "post")
}

const get = (url, params, config = {}) => {
  return request(url, params, config, "get")
}

export {sources, post, get}

以上。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/108504.html

相關(guān)文章

  • axios基于常見業(yè)務(wù)場景二次封裝(更新)

    摘要:時(shí)隔一年再次更新下根據(jù)項(xiàng)目下常見業(yè)務(wù)場景對的二次封裝功能實(shí)現(xiàn)兼容瀏覽器避免緩存減少或更新重復(fù)請求接口域名使用環(huán)境變量全局狀態(tài)可關(guān)閉的全局錯(cuò)誤提醒可開啟攜帶全局分頁參數(shù)攔截器請求攔截器請求開始請求出錯(cuò)響應(yīng)攔截器請求結(jié)束請求錯(cuò)誤處理網(wǎng)絡(luò)請求中, 時(shí)隔一年再次更新下根據(jù)vue項(xiàng)目下常見業(yè)務(wù)場景對axios的二次封裝 功能實(shí)現(xiàn):1.兼容ie瀏覽器避免緩存2.減少或更新重復(fù)請求3.接口域名使用環(huán)...

    dailybird 評論0 收藏0
  • axios 二次封裝(攔截重復(fù)請求、異常統(tǒng)一處理)

    摘要:攔截重復(fù)請求如何標(biāo)識每個(gè)請求下面函數(shù),通過一個(gè)請求參數(shù)中的請求傳遞參數(shù)或請求傳遞參數(shù)來表示每一個(gè)請求。 一直想封裝一下 axios, 可以方便項(xiàng)目中使用,今天有時(shí)間,就好好研究了一下。 源碼: // util/axios.js import axios from axios const pending = {} const CancelToken = axios.CancelTok...

    luzhuqun 評論0 收藏0
  • 如何構(gòu)建通用存儲中間層

    摘要:并且數(shù)據(jù)同步后默認(rèn)會保存下來,這樣下次再請求時(shí)存儲層中就有數(shù)據(jù)了。以下參數(shù)會傳到中這么一來,存儲層就和接口層對接起來了。五支持永久保存在某些場景下,可能不方便寫過期時(shí)間,這時(shí)默認(rèn)可以傳遞,標(biāo)記該數(shù)據(jù)永不過期。 零、問題的由來 開門見山地說,這篇文章【又】是一篇安利軟文~,安利的對象就是 tua-storage。 顧名思義,這就是一款存儲數(shù)據(jù)的工具。 用 tua-storage 好處大大...

    hersion 評論0 收藏0
  • axios入門實(shí)踐

    摘要:使用了攔截器處理相關(guān)問題,這樣就不再需要使用來做錯(cuò)誤的處理。萬惡的攔截器一些處理無論是對成功的處理還是對失敗的處理,如果攔截器不拋出錯(cuò)誤,那么終將還會執(zhí)行里面處理請求成功的函數(shù),即使你返回。 一 前言 本文適合剛接觸axios或者使用過幾次的同學(xué)來分享交流一些入門經(jīng)驗(yàn),本文同樣適用熟悉axios的同學(xué)來作為參考手冊。默認(rèn)你已經(jīng)看過axios的相關(guān)文檔:axios文檔 GitHub,通過...

    kamushin233 評論0 收藏0
  • 如何構(gòu)建通用 api 中間層

    摘要:是在收到響應(yīng)后執(zhí)行的函數(shù),可以不用返回。一步步介紹了如何構(gòu)建以及使用中間層,來統(tǒng)一管理接口地址,最后還介紹了下中間件等高級功能。 零、問題的由來 開門見山地說,這篇文章是一篇安利軟文~,安利的對象就是最近搞的 tua-api。 顧名思義,這就是一款輔助獲取接口數(shù)據(jù)的工具。 發(fā)請求相關(guān)的工具辣么多,那我為啥要用你呢? 理想狀態(tài)下,項(xiàng)目中應(yīng)該有一個(gè) api 中間層。各種接口在這里定義,業(yè)務(wù)...

    BingqiChen 評論0 收藏0

發(fā)表評論

0條評論

閱讀需要支付1元查看
<