vue中簡單的axios二次封裝

2021-03-02 前端學苑

關注「前端學苑」 ,堅持每天進步一點點

「~axios封裝~」

前端技術真是一個發展飛快的領域,jquery的時代,那時用的是 ajax 來處理數據請求。現在vue時代已經到來,axios 和 fetch都已經開始分別搶佔「請求」這個前端高地。本文將會嘗試著闡述他們之間的區別,並給出自己的一些理解。

一、ajax, Axios, Fetch區別:

1、JQuery ajax ( 廉頗老矣,尚能飯,但是總有飯不動的一天 

對原生XHR的封裝,除此以外還增添了對JSONP的支持。JQuery ajax經過多年的更新維護,真的已經是非常的方便了。

$.ajax({   type: 'POST',   url: url,   data: data,   dataType: dataType,   success: function () {},   error: function () {}});

缺點:

1)本身是針對MVC的編程,不符合現在前端MVVM的浪潮。

2)基於原生的XHR開發,XHR本身的架構不清晰,已經有了fetch的替代方案。

3)JQuery整個項目太大,單純使用ajax卻要引入整個JQuery非常的不合理(採取個性化打包的方案又不能享受CDN服務)

最主要的是隨著VUE,REACT新一代框架的興起,以及ES規範的完善,更多API的更新,JQuery這種大而全的JS庫,未來的路會越走越窄

2、Axios ( 誰敢橫刀立馬,唯Axios將軍

Vue2.0之後,Axios替換JQuery ajax。Axios 是一個基於 promise 的 HTTP 庫,用於瀏覽器和node.js等http客戶端。符合最新的ES規範。

axios({    method: 'post',    url: '/user/12345',    data: {        firstName: 'Fred',        lastName: 'Flintstone'    }}).then(function (response) {    console.log(response);}).catch(function (error) {    console.log(error);});

Axios特性

1)支持 promise API

2)攔截請求和響應

3)轉換請求數據和響應數據

4)取消請示

5)自動轉換JSON數據

6)客戶端支持防禦 XSRF

3、Fetch ( 酋長的孩子,還需成長

Fetch號稱是AJAX的替代品,好處如下:

1) 符合關注分離,沒有將輸入、輸出和用事件來跟蹤的狀態混雜在一個對象裡。

2) 更好更方便的寫法,諸如:

try {  let response = await fetch(url);  let data = response.json();  console.log(data);} catch(e) {  console.log("Oops, error", e);}

Fetch的優勢主要優勢就是:

1)更加底層,提供的API豐富(request, response)

2)脫離了XHR,是ES規範裡新的實現方式

Fetch 常見坑

1)Fetch 請求默認是不帶 cookie 的,需要設置 fetch(url, {credentials: 'include'})

2)伺服器返回 400,500 錯誤碼時並不會 reject,只有網絡錯誤這些導致請求不能完成時,fetch 才會被 reject。

二、Vue中axios的使用


axios為什麼要二次封裝

1、代碼封裝,重用性高,減少代碼量,減低維護難度。

2、統一處理一些常規的問題一勞永逸,如http錯誤。

3、攔截請求和響應,提前對數據進行處理,如獲取token,修改配置項。

1、請求配置默認值

1)全局的 axios 默認值
axios.defaults.baseURL = 'https://api.example.com';axios.defaults.headers.common['Authorization'] = AUTH_TOKEN;axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';

2)自定義實例默認值
// 創建實例時設置配置的默認值var instance = axios.create({  baseURL: 'https://api.example.com'});
// 在實例已創建後修改默認值instance.defaults.headers.common['Authorization'] = AUTH_TOKEN;

2、axios常用請求方法

axios請求方法:get,post,put,patch,delete

get: 獲取數據

post: 提交數據 (表單提交+文件上傳)

put: 更新數據 (所有數據推送到後端)

patch: 更新數據 (只將修改的數據推送到後端)

delete: 刪除數據

1)get方法傳遞參數時需注意

axios.get('/data/json',{  params: {    id: 12  }}).then(res => {  console.log(res);  })

說明:

status code: 304 not modified  //請求到的數據與上次相同就會返回304  數據重定向。

2)post方法

常用的data格式:

(1)form-data 用於表單提交,圖標與文件上傳

Content-Type:multipart/from-data  //表示post方式以 formdata 形式發送

(2)applicition/json

Content-Type:applicition/json   //表示post方式以 json 格式發送 

3)delete方法

(1)接口需要在url上拼接參數

axios.delete('/delete',{  params:{id: 12}     //query string parameters}).then()

(2)不是在url上進行傳輸的

axios.delete('/delete',{    data:{id: 12}       //request payload}).then()

4)並發請求

並發請求:同時進行多個請求,並統一處理返回值。兩個步驟:

(1)axios.all([]).then()

(2)axios.spread()

axios.all([  axios.get('url1'),  axios.get('url2')]).then(  axios.spread((res1, res2) => {    console.log(res1, res2);  }))

3、攔截器

1)攔截器科普
// 添加請求攔截器axios.interceptors.request.use(function (config) {    // 在發送請求之前做些什麼    return config;}, function (error) {    // 對請求錯誤做些什麼    return Promise.reject(error);});
// 添加響應攔截器axios.interceptors.response.use(function (response) { // 對響應數據做點什麼 return response;}, function (error) { // 對響應錯誤做點什麼 return Promise.reject(error);});

2)取消攔截器

let interceptors = axios.interceptors.request.use(  config => {    // 在發送請求前做些什麼    return config  },  error => {    // 請求錯誤的時候做什麼    return Promise.reject(error)  });// 取消攔截器axios.interceptors.request.eject(interceptors);

3)響應的錯誤處理封裝

axios.interceptors.response.use(response => {    return response;}, error => {    if (error && error.response.status) {        switch(error.response.status) {            case 400:                error.message = '請求錯誤';                break;            case 401:                error.message = '未授權,請重新登錄';                break;            case 403:                error.message = '拒絕訪問';                break;            case 500:                error.message = '服務端出錯';            default:                error.message = `連接錯誤${error.message.status}`;        }    }    else {        error.message = '連接伺服器失敗';    }    return Promise.resolve(error);});

總結

1 、對axios的二次封裝可以統一前後端交互的請求/響應數據類型,統一處理http錯誤碼和自定義的code,避免在組件中頻繁的判斷,以及code碼的使用混亂。

2、對api的集中管理和按需引用有助於項目管理和重構,代碼的復用,實際項目開發時可以按模塊對api進行劃分,結構清晰。


推薦熱門技術文章:

2、初探 Electron 桌面應用 - 理論篇

3、解鎖 Webpack,看這篇就夠了

4、乾貨:前端開發常見規範

5、這一次,徹底弄懂 Promise

6、關於移動端適配,你必須要知道的

7、你還是只會 npm install 嗎?

8、讓程式設計師變懶的 「vue-admin-template」 後臺管理系統

9、這樣配置,讓你的VS Code好用到飛起!

10、前端性能優化實戰

覺得本文對你有幫助?請分享給更多人

關注「前端學苑」加星標,提升前端技能

相關焦點

  • Vue開發使用Axios遇到了大坑!
    換成區域網其它PC電腦訪問,很多頁面正常,部分頁面異步請求不正常,所有的http請求都統一在一個axios工具裡封裝的。為何有些報錯,有些不報錯呢?太奇怪了唉。但是在我工程開發的本機一切全部都正常!比如區域數據加載,數據為全雲南省行政區數據,在我本機請求正常,但區域網其它瀏覽器訪問就網絡請求報錯,控制臺顯示為incomplete encoding?
  • 【vue2.0進階】用axios來實現數據請求,簡單易用
    你可以繼續用,但不再更新既然官方都不再更新vue-resource,並推薦大家使用axios,那我們就一起來學習一下它。 同樣我們需要事先安裝好它,可以npm和bower安裝,我們這裡用最簡單的cdn加載。
  • Springboot Vue Login(從零開始實現Springboot+Vue登錄)
    進入到創建的 Vue 項目目錄,添加依賴框架:cd vue-spring-login-summed (進入到項目根目錄)vue add element (添加 element,一個 element 風格的 UI 框架)npm install axios (安裝 axios,用於網絡請求)npm install vuex --save(安裝 Vuex,用於管理狀態)
  • fetch和axios接口調用方式的用法
    前端接口調用的幾種方式 ,有原生ajax ,基於jQuery的ajax ,fetch ,axios關於原生ajax ,基於jQuery的ajax都已經簡單介紹過,下面來看看es6接口調用方式fetch,PATCH和PUT默認的是 GET 請求需要在 options 對象中 指定對應的 method method:請求使用的方法post 和 普通 請求的時候 需要在options 中 設置 請求頭 headers
  • Vue與axios的完美結合
    如今也是時候來一波技術換新,axios真香~介紹前一陣子我也使用過axios,當時的想法很簡單,axios更專注於數據交互。放棄的理由也很簡單,不熟悉,使用起來不順手。但當我再次去關注axios的時候,才發現它真的魅力四射啊!
  • 實戰教學使用 Vue3 重構 Vue2 項目(萬字好文推薦)
    [hash].js) for this route    // which is lazy-loaded when the route is visited.    component: () =>      import(/* webpackChunkName: "about" */ "..
  • Vue 項目中哪些問題戳中你的痛點?你又是如何解決的?(更新中)
    $axios.get('app.php?m=App&c=Index&a=index'),很簡單有木有。此時如果你在network中查看xhr請求,你會發現顯示的是localhost:8080/api的請求地址。
  • Spring Boot+Vue|axios異步請求數據的12種操作(上篇)
    axios 組件來完成,axios 是一個基於Promise 用於瀏覽器和 nodejs 的 HTTP 客戶端,可以用在瀏覽器和 node.js 中。Vue 工程中使用 axios,首先要安裝 axios,命令如下所示。然後創建 Vue 工程,手動導入 axios 組件,命令如下所示。Vue 環境搭建好之後,創建 Spring Boot 工程,之後就可以分別完成前後端代碼的開發。
  • 10個簡單的技巧讓你的 vue.js 代碼更優雅
    ,讓我們的代碼看起來更加優雅,讓我們拋棄繁雜的代碼,一起開啟簡單的旅程~~01、slots 新語法向 3.0 看齊使用帶有「#」的新命名插槽縮寫語法,在Vue 2.6.0+中可用04、vue中的$props、$attrs和$listeners(可用來二次封裝組件)$props:當前組件接收到的 props 對象。Vue 實例代理了對其 props 對象屬性的訪問。假如有個input輸入框。我們有很多的原生屬性,比如:name、placeholder、disabled等等。我們如果都定義在props顯示接收,未免太過繁瑣。
  • 前端ajax或axios發送數據後端實體類接受(實例和報錯原因)
    用到最多的就是ajax和vue組件的axios來傳數據到後端。首先,小喵在學習的過程中發現如果在數據傳輸過程中各種報錯的話,可能是在哪些方面的。ajax不能傳後臺沒有的參數,或者實體中沒有的成員變量。還有就是,這句是小喵在別人的博客上看到的一段:@RequestBody接收的是一個Json對象的字符串,而不是一個Json對象。在ajax請求往往傳的都是Json對象,用 JSON.stringify(data)的方式就能將對象變成字符串。
  • 1024專屬視頻 | 前端視頻:基礎入門、axios、Promise、mpvue項目實戰
    除此之外,課程涵蓋大量的CSS技巧、動畫、交互效果,對傳統浮動和定位的布局方式,以及CSS3中的彈性盒和響應式布局都有深入講解。是前端必備的前後交互ajax請求庫, vue/react官方推薦使用。本視頻教程從基本的HTTP請求協議開始,到封裝XHR定義簡潔版axios;從axios的基本語法使用,到難點技術使用分析,最後進行axios源碼的深入分析,幫助學習者深入掌握axios技術。
  • 史上最全:Vue 相關開源項目庫匯總
    ★737 - Vue.js的瀑布布局組件radon-ui ★715 - 快速開發產品的Vue組件庫vue-loop ★701 - 無限的內容循環vue-chartjs ★694 - vue中的Chartjs的封裝vue-carbon ★684 - 基於 vue 開發MD風格的移動端vue-syntax-highlight ★655
  • 10個簡單的技巧讓你的 vue.js 代碼更優雅 - 酷扯兒
    本文轉載自【微信公眾號:前端人,ID:FrontendPeople】,經微信公眾號授權轉載,如需轉載原文作者聯繫前言作為深度代碼潔癖,我們都希望能寫出簡單高效的代碼,讓我們的代碼看起來更加優雅,讓我們拋棄繁雜的代碼,一起開啟簡單的旅程~~
  • Vue結合Django-Rest-Framework實現登錄認證(下)
    1.axios優化2.用戶註銷3.設置登錄過期時間axios優化axios的優化就是對axios進行一個封裝,單獨抽離出來一個模塊,負責發送get和post請求,同時在請求發送的同時實現認證信息的設置。
  • 重學鞏固你的Vuejs知識體系(下)
    在created中,data和methods都已經被初始化好了,如果要調用methods中的方法,或者操作data中的數據,只能在created中操作。然後vue開始編輯模板,把vue代碼中的那些指令進行執行,最終在內存中生成一個編譯好的最終模板字符串,渲染為內存中的dom,此時只是在內存中,渲染好了模板,並沒有把模板掛載到真正的頁面中去。
  • Vue.js以業務為中心的常見面試題
    mutations,這是個同步的事務,異步的邏輯應該封裝在action中。18.描述封裝vue組件的作用過程組件可以提升整個項目的開發效率,能夠把頁面抽象成多個相對獨立的模塊,解決了傳統項目開發中效率低,難維護,復用性等問題。
  • Vue 3.0前的 TypeScript 最佳入門實踐
    然鵝最近的一個項目中,是 TypeScript+ Vue,毛計喇,學之...…真香!1、使用官方腳手架構建npm install -g @vue/cli# ORyarn global add @vue/cli新的 VueCLI工具允許開發者 使用 TypeScript 集成環境 創建新項目。
  • Vue Element+Node.js開發企業通用管理後臺系統
    6-1 vuex實現原理講解6-2 vue-router實現原理講解6-3 vue-router路由守衛6-4 vue-router路由元信息6-5 vue-router API的使用第7章 前端開發框架搭建集成 Github 4.3w+ Star的明星項目 vue-element-admin,本節將基於該項目完成前端框架搭建。
  • SPA單頁面應用優化VUE性能優化
    那麼require.ensure如何在vue中使用呢?require.ensure主要是在vue的路由中使用,如果不使用代碼分割隨著頁面的增多build之後app.727c5a981063de8a5ac8.js會越來越大。使用之後會將這個js文件按頁面數量分割從而做到頁面按需加載js。
  • 20 道必看的 Vue 面試題|原力計劃
    工程中常用的 npm 命令有哪些?請說出 vue-cli 工程中每個文件夾和文件的用處。build 文件夾:存放 webpack 的相關配置以及腳本文件,在實際開發過程中只會偶爾用到 webpack.base.conf.js,配置 less、babel 等。