axios怎么封裝,才能提升效率?

大家好,我是若川。今天分享一篇axios封裝的文章。學習源碼系列、面試、年度總結、JS基礎系列。


作為前端開發者,每個項目基本都需要和后臺交互,目前比較流行的ajax庫就是axios了,當然也有同學選擇request插件,這個蘿卜白菜,各有所愛了。目前雖然axios有config、interceptor和各個請求方式,但是針對一個大型的項目,我們還是需要做二次封裝才能快速提升開發效率!

今天我們針對axios庫做二次封裝,看看是否有簡化我們的開發工作。

創建項目

??vue?create?axios-demo

創建目錄

??//?進入到項目空間中cd?axios-demo//?在src下創建api目錄

創建三個文件(index.js/interceptor.js/request.js)

/***?index.js*?api地址管理*/
export?default?{login:'/user/login',getInfo:'/user/getInfo'
}

index.js實際上和axios封裝沒有關系,因為它也屬于API這一層,所以我一起創建了,我個人習慣把項目所有url抽取到這里集中管理。

封裝interceptor

interceptor作用就是攔截,可以針對請求參數和響應結果進行攔截處理,一般在項目當中,我們主要會針對接口常規報錯、網絡報錯、系統超時、權限認證等做攔截處理。

此處我們對通過create創建實例,設置baseUrl,timeout,然后在設置request和response的攔截。

/***?生成基礎axios對象,并對請求和響應做處理*?前后端約定接口返回解構規范*?{*????code:0,*????data:"成功",*????message:""*?}*/
import?axios?from?'axios'
import?{?Message?}?from?'element-ui'//?創建一個獨立的axios實例
const?service?=?axios.create({?//?設置baseUr地址,如果通過proxy跨域可直接填寫base地址baseURL:?'/api',//?定義統一的請求頭部headers:?{post:?{"Content-Type":?"application/x-www-form-urlencoded;charset=UTF-8"}},//?配置請求超時時間timeout:?10000,?//?如果用的JSONP,可以配置此參數帶上cookie憑證,如果是代理和CORS不用設置withCredentials:?true
});
//?請求攔截
service.interceptors.request.use(config?=>?{//?自定義header,可添加項目tokenconfig.headers.token?=?'token';return?config;
});
//?返回攔截
service.interceptors.response.use((response)=>{//?獲取接口返回結果const?res?=?response.data;//?code為0,直接把結果返回回去,這樣前端代碼就不用在獲取一次data.if(res.code?===?0){return?res;}else?if(res.code?===?10000){//?10000假設是未登錄狀態碼Message.warning(res.message);//?也可使用router進行跳轉window.location.href?=?'/#/login';return?res;}else{//?錯誤顯示可在service中控制,因為某些場景我們不想要展示錯誤//?Message.error(res.message);return?res;}
},()=>{Message.error('網絡請求異常,請稍后重試!');
});
export?default?service;

如果是CORS/JSONP需要區分環境,可通過process.env.NODE_ENV來選擇使用哪個地址。如果使用的是代理,則Vue項目需要在vue.config.js中的proxy里面增加環境判斷。

process.env.NODE_ENV===?"production"???"http://www.prod.com/api"?:?"http://localhost/:3000/api"

以上是針對interceptor做的二次封裝,上面我們沒有把常規錯誤放進去,是因為我們想要在后期控制錯誤是否顯示,所以我們會在request中處理。

封裝axios

創建request文件,針對axios做適合業務發展的封裝,很多時候架構師做公共機制都是為了迎合自身項目需要,而并非一味求大做全,所以這個大家要適當調整,比如我們只用get/post請求。

/***?request.js*?通過promise對axios做二次封裝,針對用戶端參數,做靈活配置*/
import?{?Message,Loading?}?from?'element-ui';
import?instance?from?'./interceptor'/***?核心函數,可通過它處理一切請求數據,并做橫向擴展*?@param?{url}?請求地址*?@param?{params}?請求參數*?@param {options}?請求配置,針對當前本次請求;*?@param?loading?是否顯示loading*?@param?mock?本次是否請求mock而非線上*?@param?error?本次是否顯示錯誤*/
function?request(url,params,options={loading:true,mock:false,error:true},method){let?loadingInstance;//?請求前loadingif(options.loading)loadingInstance=Loading.service();return?new?Promise((resolve,reject)=>{let?data?=?{}//?get請求使用params字段if(method?=='get')data?=?{params}//?post請求使用data字段if(method?=='post')data?=?{data:params}//?通過mock平臺可對局部接口進行mock設置if(options.mock)url='http://www.mock.com/mock/xxxx/api';instance({url,method,...data}).then((res)=>{//?此處作用很大,可以擴展很多功能。//?比如對接多個后臺,數據結構不一致,可做接口適配器//?也可對返回日期/金額/數字等統一做集中處理if(res.status?===?0){resolve(res.data);}else{//?通過配置可關閉錯誤提示if(options.error)Message.error(res.message);reject(res);}}).catch((error)=>{Message.error(error.message)}).finally(()=>{loadingInstance.close();})})
}
//?封裝GET請求
function?get(url,params,options){return?request(url,params,options,'get')
}
//?封裝POST請求
function?post(url,params,options){return?request(url,params,options,'post')
}
export?default?{get,post
}

request.js主要針對axios做二次封裝,目的同樣是為了攔截所有前端請求,這樣可以做前端loading效果、mock、錯誤攔截、錯誤彈框顯示、數據適配、參數適配、環境適配等工作。

?

接下來,我們看下如何使用

  • 打開main.js

//?導入插件
import?request?from?'./api/request'
//?在原型上擴展,這樣不用在每個頁面都導入request
Vue.prototype.request?=?request;
  • 請求調用

??this.request.get('/login',{userName:'admin',userPwd:'admin'}).then((res={})=>{//?此處只接收成功數據,失敗數據不返回}).catch(()=>{//?catch?可以不要,如果想要捕獲異常,就加上去})

如果不做二次封裝,我們很難實現以上功能點,這是在公司做了很多個中型后臺系統后,總結出來的一些個人經驗,我相信您看了之后,會有一些啟發和幫助,如果有疑問或者不夠完善可以留言或聯系我,我進行修訂。


最近組建了一個江西人的前端交流群,如果你是江西人可以加我微信?ruochuan12?私信 江西?拉你進群。

推薦閱讀

我在阿里招前端,該怎么幫你(可進面試群)
我讀源碼的經歷

在字節做前端一年后,有啥收獲~
老姚淺談:怎么學JavaScript?

·················?若川簡介?·················

你好,我是若川,畢業于江西高校。現在是一名前端開發“工程師”。寫有《學習源碼整體架構系列》多篇,在知乎、掘金收獲超百萬閱讀。
從2014年起,每年都會寫一篇年度總結,已經寫了7篇,點擊查看年度總結。
同時,活躍在知乎@若川,掘金@若川。致力于分享前端開發經驗,愿景:幫助5年內前端人走向前列。

識別方二維碼加我微信、長期交流學習

今日話題

略。歡迎分享、收藏、點贊、在看我的公眾號文章~

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/275613.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/275613.shtml
英文地址,請注明出處:http://en.pswp.cn/news/275613.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

圖片有花

http://www.56.com/u50/v_NTUwMzE1NDM.html http://www.56.com/u39/v_NTUwMzE2MjA.html http://www.cnblogs.com/coffee_cn/archive/2009/11/30/1613823.html http://www.imagemagick.org/script/binary-releases.php?ImageMagickmm3e9bn5mtos6eiaelh9d4aoe4#windows 轉載于:h…

java 代碼執行el,專屬于java的漏洞——EL表達式注入

前言“FSRC經驗分享”系列文章,旨在分享焦點科技信息安全部工作過程中的經驗總結,包括但不限于漏洞分析、運營技巧、sdl推行、等保合規、自研工具等等。歡迎各位安全從業者持續關注~0x01EL簡介表達式語言(Expression Language 以下簡稱EL)是以JSTL(JavaS…

護膚產生共鳴_通過以人為本的設計編織共鳴的20個指針

護膚產生共鳴Deep into a project right now, I can’t help but reflect on how I practice empathy in design. Human centered design means empathising with and designing for people, keeping our focus on people throughout. It is not just one stage, it is a minds…

谷歌已推送 Android Q Beta 1

開發四年只會寫業務代碼,分布式高并發都不會還做程序員? >>> 今日凌晨,谷歌正式推送了 Android Q 的首個 Beta 版本,Pixel 全系列手機可以嘗鮮體驗這款最新的系統。 據官方博客介紹,Android Q 為用戶帶來了…

對使用CodeSmith模板生成NHibernate的代碼的分析

CodeSmith是我們常用的代碼生成工具,其跟據不同的模板生成不同代碼的方式能大大加快我們的項目開發,減少重復勞動。NHibernate模板就是其常用模板之一。從這里可以下載到最新的模板文件。現在最新的版本為NHibernate-v1.2.1.2125,可以生成NHi…

若川誠邀你加源碼共讀群,每周一起學源碼

小提醒:若川視野公眾號面試、源碼等文章合集在菜單欄中間【源碼精選】按鈕,歡迎點擊閱讀,也可以星標我的公眾號,便于查找。回復pdf,可以獲取前端優質書籍。最近我創建了一個源碼共讀的前端交流群,希望嘗試幫…

matlab 規范,matlab-代碼-規范

matlab-代碼-規范 1. 標識符命名原則 標識符的名字應當直觀,其長度應當符合“最小長度,最大信息量”原則。 1) 非矩陣變量: 變量名應該以小寫字母開頭的大小寫混合形式 譬如:shadowFadingTable,servingSector&#xf…

zoom視頻會議官網_人性化視頻會議的空間(Zoom等)

zoom視頻會議官網第二部分:房間的創造力 (Part Two: The Creativity of Rooms) In Part One I shared thoughts on how virtual spaces can often leave little room to embody our most human selves. The lack of a public sphere that parallels our shared publ…

KOFLive Postmortem

為期兩個月的團隊項目完成了,我們的游戲也已經發布。在這個名叫KOFLive的小游戲里,我們集成了五個真人角色,每個角色有拳腳基本招數以及三個小招、一個大招,硬值、防御、集氣、雙人對戰、人機對戰、練習模式等格斗游戲的Feature基…

單調隊列優化多重背包

就是按照 % 體積的余數來分組&#xff0c;每組單調隊列優化。 直接上模板好了。 1 #include <bits/stdc.h>2 3 typedef long long LL;4 const int N 100010;5 6 int n, V, cnt[N], cost[N];7 LL f[2][N], val[N], p[N], top, head;8 9 inline void Max(LL &a, const…

2021年7月 蝦皮、貨拉拉、有贊等面經總結

大家好&#xff0c;我是若川&#xff0c;加我微信 ruochuan12 進源碼交流群。今天分享一篇7月份新鮮出爐的面經&#xff0c;文章較長&#xff0c;可以收藏再看。學習源碼系列、面試、年度總結、JS基礎系列。本文來自作者幾米陽光 投稿 原文鏈接&#xff1a;https://juejin.cn/p…

Oracle對表名大小寫敏感嗎,讓Oracle 大小寫敏感 表名 字段名 對像名

一、解決方案1、在表名、字段名、對象名上加上雙引號&#xff0c;即可實現讓oracle大小寫區分。2、但是這又引起了另一個問題&#xff1a;在數據庫操作中&#xff0c;sql語句中相應的表名、字段名、對象名上一定要加雙引號。解決辦法是&#xff1a;使用"\"轉義。如&a…

谷歌抽屜_Google(最終)會殺死導航抽屜嗎?

谷歌抽屜A couple of months ago Google has celebrated with enthusiasm 15 years of Google Maps, one of the most used and appreciated services worldwide from the company.幾個月前&#xff0c;Google熱情地慶祝Google Maps誕生15周年&#xff0c;這是該公司在全球范圍…

MySQL——安裝

MySQL——安裝 1. 下載源&#xff1a; http://repo.mysql.com/yum/mysql-8.0-community/el/7/x86_64/mysql80-community-release-el7-2.noarch.rpm 該源目前為8.0版本&#xff0c;如果需要最新請退至根目錄找。 1wget http://repo.mysql.com/yum/mysql-8.0-community/el/7/x86_…

寫給初中級前端的高級進階指南等

大家好&#xff0c;我是若川。話不多說&#xff0c;這一次花了幾小時精心為大家挑選了20余篇好文&#xff0c;供大家閱讀學習。本文閱讀技巧&#xff0c;先粗看標題&#xff0c;感興趣可以都關注一波&#xff0c;絕對不虧。程序員成長指北考拉妹子&#xff0c;一個有趣的且樂于…

oracle for函數,oracle分區表述的FOR語句(一)

指定一個分區除了使用分區名稱外&#xff0c;很多時候還可以使用FOR語句。從11g開始&#xff0c;對分區進行操作的時候&#xff0c;不僅可以使用分區名稱&#xff0c;還可以使用FOR語句。在10g中&#xff0c;MERGE RANGE分區的語句如下&#xff1a;SQL> SELECT * FROM V$VER…

axure9控件樹 rp_如何在Axure RP 9中創建分段控件

axure9控件樹 rpSegmented controls are not very easy to tackle in prototyping. This is especially true when you have more than 2 segments. This article will show you how to create a segmented control with 3 segments in Axure in just 2 simple steps. The tech…

stack

1. 棧數據結構簡單介紹 2. 簡單實現代碼及stl中stack簡單使用 3. 代碼下載 1. 棧數據結構簡單介紹 棧是這樣的一種數據結構&#xff0c;遵循“先進后出”的原則。在stack上定義如下的operations&#xff1a; 1. 判空 2. 入棧push 3. 出棧pop&#xff0c;在棧的不同實現版本中&…

MacOS搭建環境

基礎環境 從AppStore下載 有道云筆記微信網易云音樂Chrome瀏覽器postmanChrome插件云筆記剪報基礎命令 mac下別名vi ~/.bash_profile 添加 alias llls -alF alias lals -A alias lls -CF 保存后執行(不能有空格) source ~/.bash_profile復制代碼開發環境 PhpStorm 從官網下載Ph…

【送書-小姐姐配音】低代碼平臺的核心價值與優勢

大家好&#xff0c;我是若川。記得點上方聽小姐姐配音&#xff0c;識別下方二維碼加我微信 ruochuan12&#xff0c;明天&#xff08;8月8日&#xff09;晚8點在朋友圈發動態。點贊抽3位小伙伴包郵送《實戰低代碼》&#xff0c;細則見動態。最近組織了源碼共讀活動&#xff0c;每…