首頁 web前端 前端問答 vue封裝axios有什麼用

vue封裝axios有什麼用

Dec 19, 2022 pm 05:42 PM
vue axios

vue封裝axios可以提高程式碼品質、讓使用更為便利。 axios的API很友好,開發者完全可以很輕鬆地在專案中直接使用;不過隨著專案規模增大,如果每發起一次HTTP請求,需要寫一遍設定超時時間、設定請求頭、錯誤處理等等操作。這種重複勞動不僅浪費時間,而且讓程式碼變得冗餘不堪,難以維護;為了提高我們的程式碼質量,應該在專案中二次封裝一下axios再使用,這樣可以讓使用更為便利。

vue封裝axios有什麼用

本教學操作環境:windows7系統、vue3版,DELL G3電腦。

axios是什麼

axios 是一個輕量的HTTP客戶端

基於XMLHttpRequest 服務來執行HTTP 請求,支援豐富的配置,支援Promise,支援瀏覽器端和Node.js 端。自Vue2.0起,尤大宣布取消對 vue-resource 的官方推薦,轉而推薦 axios。現在axios 已經成為大部分Vue 開發者的首選

#為什麼要封裝

axios 的API 很友好,你完全可以輕鬆地在專案中直接使用。

不過隨著專案規模增大,如果每發起一次HTTP請求,就要把這些例如設定逾時時間、設定請求頭、根據專案環境判斷使用哪個請求位址、錯誤處理等等操作,都需要寫一遍

這種重複勞動不僅浪費時間,而且讓程式碼變得冗餘不堪,難以維護。為了提高我們的程式碼質量,我們應該在專案中二次封裝一下axios 再使用

舉個例子:

axios('http://localhost:3000/data', {
  // 配置代码
  method: 'GET',
  timeout: 1000,
  withCredentials: true,
  headers: {
    'Content-Type': 'application/json',
    Authorization: 'xxx',
  },
  transformRequest: [function (data, headers) {
    return data;
  }],
  // 其他请求配置...}).then((data) => {
  // todo: 真正业务逻辑代码
  console.log(data);}, (err) => {
  // 错误处理代码  
  if (err.response.status === 401) {
  // handle authorization error
  }
  if (err.response.status === 403) {
  // handle server forbidden error
  }
  // 其他错误处理.....
  console.log(err);});
登入後複製

如果每個頁面都發送類似的請求,都要寫一堆的配置與錯誤處理,就顯得過於繁瑣了

這時候我們就需要對axios進行二次封裝,讓使用更為便利

如何封裝

封裝的同時,你需要和後端協商好一些約定,請求頭,狀態碼,請求超時時間.......

設定介面請求前綴:根據開發、測試、生產環境的不同,前綴需要加以區分

請求頭: 來實現一些具體的業務,必須攜帶一些參數才可以請求(例如:會員業務)

狀態碼: 根據介面返回的不同status , 來執行不同的業務,這塊需要和後端約定好

請求方法:根據get、post等方法進行一個再次封裝,使用起來更為方便

請求攔截器: 根據請求的請求頭設定,來決定哪些請求可以存取

回應攔截器: 這塊就是根據後端`返回的狀態碼判定執行不同業務

設定介面請求前綴

利用node環境變數來判斷,用來區分開發、測試、生產環境

if (process.env.NODE_ENV === 'development') {
  axios.defaults.baseURL = 'http://dev.xxx.com'
} else if (process.env.NODE_ENV === 'production') {
  axios.defaults.baseURL = 'http://prod.xxx.com'
}
登入後複製

在本地偵錯的時候,還需要在vue.config.js檔案中設定devServer實作代理轉發,從而實作跨網域

devServer: {
    proxy: {
      '/proxyApi': {
        target: 'http://dev.xxx.com',
        changeOrigin: true,
        pathRewrite: {
          '/proxyApi': ''
        }
      }
    }
  }
登入後複製

設定請求頭與逾時時間

##大部分情況下,請求頭都是固定的,只有少數情況下,會需要一些特殊的請求頭,這裡將普適性的請求頭作為基礎配置。當需要特殊請求頭時,將特殊請求頭作為參數傳入,覆寫基礎配置

const service = axios.create({
    ...
    timeout: 30000,  // 请求 30s 超时
	  headers: {
        get: {
          'Content-Type': 'application/x-www-form-urlencoded;charset=utf-8'
          // 在开发中,一般还需要单点登录或者其他功能的通用请求头,可以一并配置进来
        },
        post: {
          'Content-Type': 'application/json;charset=utf-8'
          // 在开发中,一般还需要单点登录或者其他功能的通用请求头,可以一并配置进来
        }
  },
})
登入後複製

#封裝請求方法

先引入封裝好的方法,在要呼叫的介面重新封裝成一個方法暴露出去

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

// post
// post请求
export function httpPost({
  url,
  data = {},
  params = {}
}) {
  return new Promise((resolve, reject) => {
    axios({
      url,
      method: 'post',
      transformRequest: [function (data) {
        let ret = ''
        for (let it in data) {
          ret += encodeURIComponent(it) + '=' + encodeURIComponent(data[it]) + '&'
        }
        return ret
      }],
      // 发送的数据
      data,
      // url参数
      params

    }).then(res => {
      resolve(res.data)
    })
  })
}
登入後複製

把封裝的方法放在一個api.js檔案中

import { httpGet, httpPost } from './http'
export const getorglist = (params = {}) => httpGet({ url: 'apps/api/org/list', params })
登入後複製

頁面中就能直接呼叫

// .vue
import { getorglist } from '@/assets/js/api'

getorglist({ id: 200 }).then(res => {
  console.log(res)
})
登入後複製

這樣可以把api統一管理起來,以後維護修改只需要在api.js檔案操作即可

請求攔截器

請求攔截器可以在每個請求裡加上token,做了統一處理後維護起來也方便

// 请求拦截器
axios.interceptors.request.use(
  config => {
    // 每次发送请求之前判断是否存在token
    // 如果存在,则统一在http请求的header都加上token,这样后台根据token判断你的登录情况,此处token一般是用户完成登录后储存到localstorage里的
    token && (config.headers.Authorization = token)
    return config
  },
  error => {
    return Promise.error(error)
  })
登入後複製

回應攔截器##回應攔截器可以在接收到回應後先做一層操作,如根據狀態碼判斷登入狀態、授權

// 响应拦截器
axios.interceptors.response.use(response => {
  // 如果返回的状态码为200,说明接口请求成功,可以正常拿到数据
  // 否则的话抛出错误
  if (response.status === 200) {
    if (response.data.code === 511) {
      // 未授权调取授权接口
    } else if (response.data.code === 510) {
      // 未登录跳转登录页
    } else {
      return Promise.resolve(response)
    }
  } else {
    return Promise.reject(response)
  }
}, error => {
  // 我们可以在这里对异常状态作统一处理
  if (error.response.status) {
    // 处理请求失败的情况
    // 对不同返回码对相应处理
    return Promise.reject(error.response)
  }
})
登入後複製

小結

封裝是程式設計中很有意義的手段,簡單的axios封裝,就可以讓我們可以領略到它的魅力

封裝axios 沒有一個絕對的標準,只要你的封裝可以滿足你的專案需求,並且用起來方便,那就是一個好的封裝方案

【相關推薦:

vuejs影片教學

web前端開發

以上是vue封裝axios有什麼用的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

vue中怎麼用bootstrap vue中怎麼用bootstrap Apr 07, 2025 pm 11:33 PM

在 Vue.js 中使用 Bootstrap 分為五個步驟:安裝 Bootstrap。在 main.js 中導入 Bootstrap。直接在模板中使用 Bootstrap 組件。可選:自定義樣式。可選:使用插件。

vue怎麼給按鈕添加函數 vue怎麼給按鈕添加函數 Apr 08, 2025 am 08:51 AM

可以通過以下步驟為 Vue 按鈕添加函數:將 HTML 模板中的按鈕綁定到一個方法。在 Vue 實例中定義該方法並編寫函數邏輯。

vue中的watch怎麼用 vue中的watch怎麼用 Apr 07, 2025 pm 11:36 PM

Vue.js 中的 watch 選項允許開發者監聽特定數據的變化。當數據發生變化時,watch 會觸發一個回調函數,用於執行更新視圖或其他任務。其配置選項包括 immediate,用於指定是否立即執行回調,以及 deep,用於指定是否遞歸監聽對像或數組的更改。

vue多頁面開發是啥意思 vue多頁面開發是啥意思 Apr 07, 2025 pm 11:57 PM

Vue 多頁面開發是一種使用 Vue.js 框架構建應用程序的方法,其中應用程序被劃分為獨立的頁面:代碼維護性:將應用程序拆分為多個頁面可以使代碼更易於管理和維護。模塊化:每個頁面都可以作為獨立的模塊,便於重用和替換。路由簡單:頁面之間的導航可以通過簡單的路由配置來管理。 SEO 優化:每個頁面都有自己的 URL,這有助於搜索引擎優化。

vue返回上一頁的方法 vue返回上一頁的方法 Apr 07, 2025 pm 11:30 PM

Vue.js 返回上一頁有四種方法:$router.go(-1)$router.back()使用 <router-link to="/"> 組件window.history.back(),方法選擇取決於場景。

vue.js怎麼引用js文件 vue.js怎麼引用js文件 Apr 07, 2025 pm 11:27 PM

在 Vue.js 中引用 JS 文件的方法有三種:直接使用 <script> 標籤指定路徑;利用 mounted() 生命週期鉤子動態導入;通過 Vuex 狀態管理庫進行導入。

vue遍歷怎麼用 vue遍歷怎麼用 Apr 07, 2025 pm 11:48 PM

Vue.js 遍歷數組和對像有三種常見方法:v-for 指令用於遍歷每個元素並渲染模板;v-bind 指令可與 v-for 一起使用,為每個元素動態設置屬性值;.map 方法可將數組元素轉換為新數組。

vue的div怎麼跳轉 vue的div怎麼跳轉 Apr 08, 2025 am 09:18 AM

Vue 中 div 元素跳轉的方法有兩種:使用 Vue Router,添加 router-link 組件。添加 @click 事件監聽器,調用 this.$router.push() 方法跳轉。

See all articles