03 在Vue項(xiàng)目中管理Axios請(qǐng)求和API接口

目的

嘗試封裝Axios瞒滴,并集中管理接口姨夹。目的是進(jìn)一步提高項(xiàng)目的可維護(hù)性夸溶。

思路

  1. 確保項(xiàng)目中已經(jīng)安裝了Axios
  2. 在request.js文件中導(dǎo)入Axios吴旋,封裝后導(dǎo)出給api.js损肛;
  3. 在api.js文件中導(dǎo)入request.js中封裝好的請(qǐng)求,定制接口荣瑟,隨后導(dǎo)出治拿;
  4. 在頁(yè)面中使用api.js暴露出的接口。

有思路了可以首先改造項(xiàng)目目錄笆焰,在/src文件夾新建request文件夾劫谅,同時(shí)在此創(chuàng)建兩個(gè)文件,分別是:

  • request.js (用來(lái)管理Axios請(qǐng)求)
  • api.js (用來(lái)管理API接口)


    項(xiàng)目目錄.png

封裝Axios請(qǐng)求

在request.js文件中導(dǎo)入axios
導(dǎo)入qs嚷掠,暫時(shí)只知道這個(gè)是用來(lái)序列化字符串的庫(kù)
有需要的話捏检,導(dǎo)入輕提示UI組件 toast
導(dǎo)入vuex store因?yàn)閿r截請(qǐng)求前奸例,要驗(yàn)證里面的狀態(tài)對(duì)象
導(dǎo)入路由迎变,用于解決跳轉(zhuǎn)

import axios from 'axios'
import QS from 'qs'
import { Toast } from 'vant'
import store from '@/store'
import router from '@/router'

環(huán)境配置

// 分別配置開發(fā)、調(diào)試鸭叙、發(fā)布時(shí)請(qǐng)求的根地址
if (process.env.NODE_ENV === 'development') {
  axios.defaults.baseURL = ''
} else if (process.env.NODE_ENV === 'debug') {
  axios.defaults.baseURL = ''
} else if (process.env.NODE_ENV === 'production') {
  axios.defaults.baseURL = ''
}

請(qǐng)求的基本配置

// 設(shè)置鏈接超時(shí)時(shí)長(zhǎng)
axios.defaults.timeout = 1000 * 5
// 設(shè)置post請(qǐng)求頭
axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded;charset=UTF-8'

請(qǐng)求的攔截

axios.interceptors.request.use(
  config => {
    // 請(qǐng)求前判斷token是否存在霹娄,如果存在能犯,再請(qǐng)求的header都加上token
    const token = store.state.token
    token && (config.headers.Authorization = token)
    return config
  },
  error => {
    return Promise.error(error)
  }
)

返回的攔截

axios.interceptors.response.use(
  response => {
    // 如果狀態(tài)200鲫骗,請(qǐng)求成功,否則拋出錯(cuò)誤
    if (response.status === 200) {
      return Promise.resolve(response)
    } else {
      return Promise.reject(response)
    }
  },
  // 根據(jù)后臺(tái)錯(cuò)誤狀態(tài)碼進(jìn)行操作
  // 以下是常規(guī)操作踩晶,其他需求自行拓展
  error => {
    if (error.response.status) {
      switch (error.response.status) {
        // 401 未登錄
        case 401:
          // 跳轉(zhuǎn)到登陸頁(yè)面执泰,并攜帶當(dāng)前頁(yè)面路徑
          router.replace({
            path: '/login',
            query: {
              redirect: router.currentRoute.fullPath
            }
          })
          break
        // 403 token過(guò)期
        case 403:
          // 做出提示
          Toast({
            message: '403登陸信息異常,請(qǐng)重新登陸'
          })
          // 清除本地token
          localStorage.removeItem('token')
          // 清除vuex中的token對(duì)象
          store.commit('loginSucsess', null)
          // 1秒后渡蜻,跳轉(zhuǎn)到登陸頁(yè)面坦胶,并攜帶當(dāng)前頁(yè)面路徑
          setTimeout(() => {
            router.replace({
              path: '/login',
              query: {
                redirect: router.currentRoute.fullPath
              }
            })
          }, 1000)
          break
        // 404請(qǐng)求不存在
        case 404:
          Toast({
            message: '404請(qǐng)求不存在'
          })
          break
        default:
          // 提示信息
          Toast({
            message: error.response.data.message
          })
      }
      return Promise.reject(error.response)
    }
  }
)

封裝并導(dǎo)出get方法

export function get (url, params) {
  return new Promise((resolve, reject) => {
    axios.get(url, {
      params: params
    })
      .then(res => {
        resolve(res.data)
      })
      .catch(err => {
        reject(err.data)
      })
  })
}

封裝并導(dǎo)出post方法
這里有個(gè)問(wèn)題要注意,axios.get()方法和axios.post()在提交數(shù)據(jù)時(shí)參數(shù)的書寫方式還是有區(qū)別的晴楔。get的第二個(gè)參數(shù)是一個(gè)對(duì)象,這個(gè)對(duì)象的params屬性值是參數(shù)對(duì)象峭咒。而post的第二個(gè)參數(shù)直接就是一個(gè)參數(shù)對(duì)象税弃。

export function post (url, params) {
  return new Promise((resolve, reject) => {
    axios.post(url, params)
      .then(res => {
        resolve(res.data)
      })
      .catch(err => {
        reject(err.data)
      })
  })
}

API統(tǒng)一管理

在api.js文件中,導(dǎo)入request.js中封裝好的get方法

import { get } from './request.js'

把接口暴露出去

// 如果有必要凑队,把跟地址單獨(dú)處理
const baseUrl = 'https://your_api_base_url.com'
// 定義接口则果,然后暴露出去
export const apiName = (params) => get(baseUrl + '/your_api_adress', params)

在需要使用接口的地方

// 導(dǎo)入接口
import { apiName } from '@/request/api.js'
// 使用接口
apiName(params)
    .then(res => {
       // 成功后的操作
    })
    .catch(res => {
       // 失敗后的操作
    })
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市漩氨,隨后出現(xiàn)的幾起案子西壮,更是在濱河造成了極大的恐慌,老刑警劉巖叫惊,帶你破解...
    沈念sama閱讀 217,084評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件款青,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡霍狰,警方通過(guò)查閱死者的電腦和手機(jī)抡草,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,623評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)蔗坯,“玉大人康震,你說(shuō)我怎么就攤上這事”霰簦” “怎么了腿短?”我有些...
    開封第一講書人閱讀 163,450評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)绘梦。 經(jīng)常有香客問(wèn)我橘忱,道長(zhǎng),這世上最難降的妖魔是什么谚咬? 我笑而不...
    開封第一講書人閱讀 58,322評(píng)論 1 293
  • 正文 為了忘掉前任鹦付,我火速辦了婚禮,結(jié)果婚禮上择卦,老公的妹妹穿的比我還像新娘敲长。我一直安慰自己郎嫁,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,370評(píng)論 6 390
  • 文/花漫 我一把揭開白布祈噪。 她就那樣靜靜地躺著泽铛,像睡著了一般。 火紅的嫁衣襯著肌膚如雪辑鲤。 梳的紋絲不亂的頭發(fā)上盔腔,一...
    開封第一講書人閱讀 51,274評(píng)論 1 300
  • 那天,我揣著相機(jī)與錄音月褥,去河邊找鬼弛随。 笑死,一個(gè)胖子當(dāng)著我的面吹牛宁赤,可吹牛的內(nèi)容都是我干的舀透。 我是一名探鬼主播,決...
    沈念sama閱讀 40,126評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼决左,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼愕够!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起佛猛,我...
    開封第一講書人閱讀 38,980評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤惑芭,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后继找,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體遂跟,經(jīng)...
    沈念sama閱讀 45,414評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,599評(píng)論 3 334
  • 正文 我和宋清朗相戀三年婴渡,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了漩勤。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,773評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡缩搅,死狀恐怖越败,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情硼瓣,我是刑警寧澤究飞,帶...
    沈念sama閱讀 35,470評(píng)論 5 344
  • 正文 年R本政府宣布,位于F島的核電站堂鲤,受9級(jí)特大地震影響亿傅,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜瘟栖,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,080評(píng)論 3 327
  • 文/蒙蒙 一葵擎、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧半哟,春花似錦酬滤、人聲如沸签餐。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,713評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)氯檐。三九已至,卻和暖如春体捏,著一層夾襖步出監(jiān)牢的瞬間冠摄,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,852評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工几缭, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留河泳,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,865評(píng)論 2 370
  • 正文 我出身青樓年栓,卻偏偏與公主長(zhǎng)得像乔询,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子韵洋,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,689評(píng)論 2 354

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

  • axios非常方便,但是如果在每個(gè)組件中走一遍axios流程黄锤,最終又會(huì)寫出“意大利面條”式的代碼搪缨。況且很多時(shí)候在前...
    Angeladaddy閱讀 31,410評(píng)論 3 66
  • axios是一個(gè)promise實(shí)現(xiàn)的http庫(kù),符合最新的ES規(guī)范鸵熟。我們?yōu)樯兑眠@個(gè)東西呢副编,主要有以下幾個(gè)原因: ...
    我是你班主任閱讀 24,426評(píng)論 28 44
  • 人生來(lái)就有自己的看法。幼兒有對(duì)母乳的看法流强,兒童有對(duì)游戲的看法痹届,青年有對(duì)女性的看法,中年也有對(duì)事業(yè)的看法打月《痈看法有...
    透明墻紙閱讀 131評(píng)論 0 1
  • 子曰:“富與貴,是人之所欲也奏篙;不以其道得之柴淘,不處也。貧與賤秘通,是人之所惡也为严;不以其道得之,不去也肺稀。君子去仁第股,惡乎成名...
    玄奇閱讀 186評(píng)論 0 0