axios二次封裝


 

axios封裝

// 封裝axios
// 1.導入axios
// 2.創建axios實例
// 3.設置基礎路徑
// 4.請求和響應攔截器
// 5.請求前給請求頭添加token
// 6.響應后,如200,則簡化返回的數據
// 7.響應后,如401,則攜帶當前路由,跳轉到登錄頁
import axios from 'axios'
import store from '@/store'
import router from '@/router'
// baseURL 超時時間配置
const instance = axios.create({
  baseURL: 'http://pcapi-xiaotuxian-front-devtest.itheima.net'
})

// 全局注入token
// 請求攔截器=》發請求前
instance.interceptors.request.use(config => {
  // 在請求頭統一添加token
  const { token } = store.state.user.profile
  if (token) {
    config.headers.Authorization = `Bearer ${token}`
  }

  return config
}, e => Promise.reject(e))

// 處理返回數據 token失效跳回到登錄頁
// 響應攔截器=》成功請求
instance.interceptors.response.use(
  (response) => {
    // 請求200進入到這里
    // 把data數據返回給頁面
    return response.data
  },
  (error) => {
    // 200以外進入
    // 處理401
    if (error?.response.status === 401) {
      /**
       * 1. 獲取當前出現401的頁面路徑(目的:成功登陸之后,回到上次訪問的頁面)
       * 2. 跳回登錄頁帶上401頁面的地址
       */
      const redirectUrl = router.currentRoute.value.fullPath
      router.replace(`/login?redirectUrl=${redirectUrl}`)
    }
    return Promise.reject(error)
  }
)

二次封裝

好處:

api統一管理,不管接口有多少,所有的接口都可以非常清晰,容易維護.

通常我們的項目會越做越大,頁面也會越來越多,如果頁面非常的少,直接用axios也沒有什么大的影響,那頁面組件多了起來,上百個接口呢,

***這個時候后端改了接口,多加了一個參數什么的呢?那就只有找到那個頁面,進去修改.整個過程很繁瑣不易於項目的維護和迭代.

這個時候如果我們統一的區管理接口,需要修改某一個接口的時候直接在api里修改對應的請求是不是很方便呢?因為我們用的最多的還是get post請求.我們就可以針對封裝.

 * 二次封裝(不是必須的)
 * 基於:instance的axios新實例
 */
/**
 *
 * @param {*} url:string 請求路徑
 * @param {*} method:string 請求方法(get/post等)
 * @param {*} datas:object 請求的時候需要的參數
 */
const request = (url, method, datas) => {
  // 返回Promise對象
  return instance({
    url,
    method,
    // 對象動態屬性名
    [method.toLowerCase() === 'get' ? 'params' : 'data']: datas
  })
}

export default request

src/require/http.js

/*
***url請求路徑
***method請求方式
***datas請求參數
***isJson,true||false(控制請求頭的content-type)
*/
export function request(url, method, datas = {}, isJson = true) {
  console.log(isJson, 'isJson')
  return new Promise((resolve, reject) => {
    let token = document.cookie.split('=')[1]
    let data = method.toLowerCase() === 'get' ? qs.stringify(datas) : JSON.stringify(datas)
    axios({
      url,
      method,
      [method.toLowerCase() === 'get' ? 'params' : 'data']: data,
      headers: {
        "Content-Type": isJson ? "application/json;charset=utf-8" : "application/x-www-form-urlencoded",
        'TowattToken': token
      }
    }).then(response => {
      resolve(response.data);
    }, err => {
      reject(err)
    })
  })
}

main.js

import {request} from "./request/http"
Vue.prototype.$request = request;

調用

 this.$request(findEchargeCompanyByCompanyName, "post", {
        companyName: this.companyName,
      }).then((res) => {
        if (res) {
          this.tableData = res.rows;
        }
      });

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM