VUE 請(qǐng)求api的封裝

1.常用封裝一(跟element-admin相同)

* 1.1在腳手架目錄utils目錄新建一個(gè)request.js 文件
import axios from 'axios'
import { MessageBox, Message } from 'element-ui'
import store from '@/store'
import router from '@/router'
import { getToken } from '@/utils/auth'

// create an axios instance
const service = axios.create({
  baseURL: process.env.VUE_APP_BASE_API, // url = base url + request url
  // withCredentials: true, // send cookies when cross-domain requests
  timeout: 300000 // request timeout
})

// request interceptor
service.interceptors.request.use(
  config => {
    // do something before request is sent
    if (store.getters.token) {
      // let each request carry token
      // ['X-Token'] is a custom headers key
      // please modify it according to the actual situation
      config.headers['token'] = getToken()
    }
    return config
  },
  error => {
    // do something with request error
    console.log(error) // for debug
    return Promise.reject(error)
  }
)

// response interceptor
service.interceptors.response.use(
  /**
   * If you want to get http information such as headers or status
   * Please return  response => response
  */

  /**
   * Determine the request status by custom code
   * Here is just an example
   * You can also judge the status by HTTP Status Code
   */
  response => {
    const res = response.data
    // if the custom code is not 20000, it is judged as an error.

    if (res.code !== '0000') {
      Message({
        message: res.msg || 'Error',
        type: 'error',
        duration: 5 * 1000
      })

      // 50008: Illegal token; 50012: Other clients logged in; 50014: Token expired;
      if (res.code === 50008 || res.code === 50012 || res.code === 50014) {
        // to re-login
        MessageBox.confirm('You have been logged out, you can cancel to stay on this page, or log in again', 'Confirm logout', {
          confirmButtonText: 'Re-Login',
          cancelButtonText: 'Cancel',
          type: 'warning'
        }).then(() => {
          store.dispatch('user/resetToken').then(() => {
            location.reload()
          })
        })
      }
      if (res.code === '0002') {
        store.dispatch('user/resetToken').then(() => {
          // location.reload()
          store.dispatch('user/logout')
          router.push('/')
        })
      }
      return Promise.reject(new Error(res.message || 'Error'))
    } else {
      return res
    }
  },
  error => {
    console.log('err' + error) // for debug
    Message({
      message: error.message,
      type: 'error',
      duration: 5 * 1000
    })
    return Promise.reject(error)
  }
)

export default service
1.2 新建一個(gè)接口(api)目錄把每個(gè)模塊放到一個(gè)請(qǐng)求js文件里吏口,引用封裝的request.js
import request from '@/utils/request'
// 貨權(quán)轉(zhuǎn)移 插入
// business/ecargorightchange/{version}/insert
export function insertEcargorightchange(data) {
  return request({
    url: `/business/ecargorightchange/${version}/insert`,
    method: 'post',
    data: data
  })
}
// 貨權(quán)轉(zhuǎn)移  更新
// api/business/ecargorightchange/{version}/update
export function upDateEcargorightchange(data) {
  return request({
    url: `/business/ecargorightchange/${version}/update`,
    method: 'put',
    data: data
  })
}
// 根據(jù)ID 查詢貨權(quán)轉(zhuǎn)移
// business/ecargorightchange/123/querybyid?id=123123
export function getEcargorightchangeByid(data) {
  return request({
    url: `/business/ecargorightchange/${version}/querybyid`,
    method: 'get',
    params: data
  })
}

2.常用封裝二

2.1首先,建立一個(gè)request.js文件,引入axios屡贺,可以在該文件中签钩,前端做請(qǐng)求攔截相應(yīng)、請(qǐng)求方式統(tǒng)一處理
  • 安裝 cnpm install axios --save
2.2接下來(lái),創(chuàng)建axios實(shí)例
import axios from "axios"; //導(dǎo)入axios
export function request(config) {
    const instance = axios.create({
        baseURL: process.env.BASE_URL, // api base_url,
        timeout: 60 * 1000, // 請(qǐng)求超時(shí)時(shí)間,
        headers: { "Content-Type": "application/json" }, //請(qǐng)求頭
    });

    // 1.axios 攔截器

    // 1.1請(qǐng)求攔截
    instance.interceptors.request.use(config => {
        return config
    }, err => {
        console.log(err)
    })

    //1.2響應(yīng)攔截

    instance.interceptors.response.use(res => {
        return res.data
    }, err => {
        console.log(err)
    })

    // 1.3發(fā)送網(wǎng)絡(luò)請(qǐng)求
    return instance(config)

}

2.3 引入上面這個(gè)文件
import request from '@/utils/request'
// 貨權(quán)轉(zhuǎn)移 插入
// business/ecargorightchange/{version}/insert
export function insertEcargorightchange(data) {
  return request({
    url: `/business/ecargorightchange/${version}/insert`,
    method: 'post',
    data: data
  })
}

二.案例

案例一:響應(yīng)攔截器異常狀態(tài)碼處理

service.interceptors.response.use(
    response => {
        if (response.status === 200) {
            return Promise.resolve(response);
        } else {
            return Promise.reject(response);
        }
    },
    // 服務(wù)器狀態(tài)碼不是200的情況
    error => {
        if (error.response.status) {
            switch (error.response.status) {
                // 401: 未登錄
                // 未登錄則跳轉(zhuǎn)登錄頁(yè)面吱抚,并攜帶當(dāng)前頁(yè)面的路徑
                // 在登錄成功后返回當(dāng)前頁(yè)面俺陋,這一步需要在登錄頁(yè)操作豁延。
                case 401:
                    notification.error({
                        message: "請(qǐng)求失敗",
                        description: "登錄過期,請(qǐng)重新登錄"
                    });
                    axios.get('/relog').then(() => {
                        location.href = window.location.origin 
                    })
                    break;
                // 403 token過期
                // 登錄過期對(duì)用戶進(jìn)行提示
                // 清除本地token和清空vuex中token對(duì)象
                // 跳轉(zhuǎn)登錄頁(yè)面
                case 403:
                    notification.error({
                        message: "請(qǐng)求失敗",
                        description: "登錄過期腊状,請(qǐng)重新登錄"
                    });
                    break;
                // 404請(qǐng)求不存在
                case 404:
                    notification.error({
                        message: "請(qǐng)求失敗",
                        description: "網(wǎng)絡(luò)請(qǐng)求不存在"
                    });
                    break;
                // 其他錯(cuò)誤诱咏,直接拋出錯(cuò)誤提示
                default:
                    notification.error({
                        message: "請(qǐng)求失敗",
                        description: error.response.data.message
                    });
            }
            return Promise.reject(error.response);
        }
    }
);

案例二:分別對(duì)四種請(qǐng)求方式進(jìn)行封裝:url就是請(qǐng)求后端的地址,params是前端傳給后端的參數(shù)

image

注意

  loginApi(data, config) {
    return http.post('/zjport/user/login', data, config);
  },

  //  獲取本周某一天的菜譜以及評(píng)價(jià)接口
  foodListApi(data, config) {
    return http.get(`/zjport/weeklyFood/foodList`, { params: data }, config);
  },
  // get 如果這么封裝的話參數(shù)必須是對(duì)象 鍵名必須是params  不然發(fā)送不到參數(shù)

合并Get POST 請(qǐng)求

import axios from 'axios' //導(dǎo)入axios
import router from 'router'

export const baseURL = process.env.BASE_URL, // api base_url,



 const instance = axios.create({
  baseURL,
  timeout: 60 * 1000, // 請(qǐng)求超時(shí)時(shí)間,
  headers: {
   'Content-Type': 'application/json'
  }, //請(qǐng)求頭
 })

// 添加多余請(qǐng)求頭
const headers = {
 // 'X-token': '84cc8b79105c43708d1f4d65b952abf9',
 // 'X-Token': getToken()
};

// 1.axios 攔截器

// 1.1請(qǐng)求攔截
instance.interceptors.request.use(
 config => {

  //添加toekn q權(quán)限
  if (token) {
   config.headers.Authorization = `Bearer ${token}`
  }

  // 合并請(qǐng)求頭
  Object.assign(config.headers, headers);

  return config
 },
 err => {
  return Promise.reject(err)
 }
)

//1.2響應(yīng)攔截
instance.interceptors.response.use(
 res => {
  return res.data
 },
 err => {

  //判斷權(quán)限  跳轉(zhuǎn)到登錄頁(yè)添加跳轉(zhuǎn)之前頁(yè)面的參數(shù)
  if (err.response && err.response.status === 401) {
   const fullPath = encodeURIComponent(router.currentRoute.value.fullPath) // 當(dāng)前路由地址
   router.push('/login?redirectUrl=' + fullPath)
  }

  return Promise.reject(err)
 }
)

// 1.3發(fā)送網(wǎng)絡(luò)請(qǐng)求
return instance(config)


// 導(dǎo)出請(qǐng)求工具函數(shù)
export default (url, method, submitData,config) => {
 return instance({
  url,
  method,
  [method.toLowerCase() === 'get' ? 'params' : 'data']: submitData,
 config
 })
}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末缴挖,一起剝皮案震驚了整個(gè)濱河市胰苏,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌醇疼,老刑警劉巖硕并,帶你破解...
    沈念sama閱讀 206,482評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異秧荆,居然都是意外死亡倔毙,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門乙濒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)陕赃,“玉大人,你說(shuō)我怎么就攤上這事颁股∶纯猓” “怎么了?”我有些...
    開封第一講書人閱讀 152,762評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵甘有,是天一觀的道長(zhǎng)诉儒。 經(jīng)常有香客問我,道長(zhǎng)亏掀,這世上最難降的妖魔是什么忱反? 我笑而不...
    開封第一講書人閱讀 55,273評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮滤愕,結(jié)果婚禮上温算,老公的妹妹穿的比我還像新娘。我一直安慰自己间影,他們只是感情好注竿,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,289評(píng)論 5 373
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般巩割。 火紅的嫁衣襯著肌膚如雪胰丁。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,046評(píng)論 1 285
  • 那天喂分,我揣著相機(jī)與錄音锦庸,去河邊找鬼。 笑死蒲祈,一個(gè)胖子當(dāng)著我的面吹牛甘萧,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播梆掸,決...
    沈念sama閱讀 38,351評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼扬卷,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了酸钦?” 一聲冷哼從身側(cè)響起怪得,我...
    開封第一講書人閱讀 36,988評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎卑硫,沒想到半個(gè)月后徒恋,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,476評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡欢伏,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,948評(píng)論 2 324
  • 正文 我和宋清朗相戀三年入挣,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片硝拧。...
    茶點(diǎn)故事閱讀 38,064評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡径筏,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出障陶,到底是詐尸還是另有隱情滋恬,我是刑警寧澤,帶...
    沈念sama閱讀 33,712評(píng)論 4 323
  • 正文 年R本政府宣布抱究,位于F島的核電站恢氯,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏媳维。R本人自食惡果不足惜酿雪,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,261評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望侄刽。 院中可真熱鬧,春花似錦朋凉、人聲如沸州丹。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)墓毒。三九已至吓揪,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間所计,已是汗流浹背柠辞。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留主胧,地道東北人叭首。 一個(gè)月前我還...
    沈念sama閱讀 45,511評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像踪栋,于是被迫代替她去往敵國(guó)和親焙格。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,802評(píng)論 2 345