成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

項目實踐 - Axios進階封裝

開發 項目管理
axios二次封裝:就是把大部分接口公共的參數配置提取出來統一進行處理。

[[403088]]

 axios二次封裝解決了什么問題?(項目常用)

axios二次封裝:就是把大部分接口公共的參數配置提取出來統一進行處理。

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

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

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

Axios基礎配置- 實踐

1) 全局的 axios 默認值

  1. axios.defaults.baseURL = 'https://api.example.com'
  2. axios.defaults.headers.common['Authorization'] = AUTH_TOKEN; 
  3. axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded'

2) 自定義實例默認值

  1. // 創建實例時設置配置的默認值 
  2. var instance = axios.create({ 
  3.   baseURL: 'https://api.example.com' 
  4. }); 
  5.  
  6. // 在實例已創建后修改默認值 
  7. instance.defaults.headers.common['Authorization'] = AUTH_TOKEN; 

3) 區分環境配置

  1. let env = "dev"
  2. switch (env) { 
  3.     case 'dev'
  4.         axios.defaults.baseURL = "http://127.0.0.1:8888"
  5.         break; 
  6.     case 'test'
  7.         axios.defaults.baseURL = "http://114.27.34.1:8888"
  8.         break; 
  9.     case 'pro'
  10.         axios.defaults.baseURL = "http://api.zhufeng.cn"
  11.         break; 

4) 數據格式配置

  1. axios.defaults.headers['Content-Type'] = 'application/x-www-form-urlencoded'
  2. // axios.defaults.headers.common['Content-Type'] = 'application/x-www-form-urlencoded'
  3. // axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded'
  4. axios.defaults.transformRequest = function (data, headers) { 
  5.     let ContentType = headers['Content-Type'] || headers.common['Content-Type'] || headers.post['Content-Type'] || 'application/json'
  6.  
  7.     if (ContentType === "application/json") { 
  8.         return JSON.stringify(data); 
  9.     } 
  10.  
  11.     if (ContentType === "application/x-www-form-urlencoded") { 
  12.         return Qs.stringify(data); 
  13.     } 
  14.     return data; 
  15. }; 

項目實踐-數據格式

  1. service.interceptors.request.use( 
  2.   (config) => { 
  3.     // 開發環境引入包裝api 
  4.     config.url = `${BASE_URL}${config.url}`; 
  5.     config.headers['Cache-Control'] = 'no-cache,no-store,must-revalidate,max-age=-1,private'
  6.     // post請求并且需要將data以form data 形式傳給后端 需要傳一個formType為true boolean 
  7.     if (config.method === 'post' && config.formType === true) { 
  8.       config.headers['Content-Type'] = 'application/x-www-form-urlencoded;charset=UTF-8'
  9.       config.data = qs.stringify(config.data); 
  10.     } 
  11.     return config; 
  12.   }, 
  13.   (error) => { 
  14.     // Do something with request error 
  15.     Promise.reject(error); 
  16.   } 
  17. ); 

5) 攔截器

  1. // 添加請求攔截器 
  2. axios.interceptors.request.use(function (config) { 
  3.     // 在發送請求之前做些什么 
  4.     return config; 
  5. }, function (error) { 
  6.     // 對請求錯誤做些什么 
  7.     return Promise.reject(error); 
  8. }); 
  9.  
  10. // 添加響應攔截器 
  11. axios.interceptors.response.use(function (response) { 
  12.     // 對響應數據做點什么 
  13.     return response; 
  14. }, function (error) { 
  15.     // 對響應錯誤做點什么 
  16.     return Promise.reject(error); 
  17. }); 

6) 響應的錯誤處理封裝

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

  1. axios.interceptors.response.use(function (response) { 
  2.     // 把獲取的響應主體信息返回 
  3.     return response.data; 
  4. }, function (reason) { 
  5.     // 失敗:網絡、狀態碼(Axios失敗) 
  6.     let response = reason.response; 
  7.     if (response) { 
  8.         // 狀態碼不是2開頭的 
  9.         switch (response.status) { 
  10.             //400 參數 
  11.             //401/403 Token 
  12.             //404 地址 
  13.             //500/503 服務器 
  14.         } 
  15.     } else { 
  16.         // 網絡 / (超時 / 中斷請求  -> code: "ECONNABORTED") ... 
  17.         if (reason && reason.code === "ECONNABORTED") {} 
  18.         if (!navigator.onLine) {} 
  19.     } 
  20.     return reason; 
  21. }); 

一般項目,這樣就沒問題了,一套公共的參數配置。剩下都是請求的時候單獨再配置即可。

Axios配置- 原理與源碼

1) HTTP 攔截器的設計與實現

對于大多數 SPA 應用程序來說, 通常會使用 token 進行用戶的身份認證。這就要求在認證通過后,我們需要在每個請求上都攜帶認證信息。如果在考慮對響應進行統一處理的話,我們的 request 函數將變得越來越龐大,也越來越難維護。那么對于這個問題,Axios 為我們提供了解決方案 —— 攔截器。

Axios 是一個基于 Promise 的 HTTP 客戶端,而 HTTP 協議是基于請求和響應:

所以 Axios 提供了請求攔截器和響應攔截器來分別處理請求和響應。

1) 請求攔截器:該類攔截器的作用是在請求發送前統一執行某些操作,比如在請求頭中添加 token 字段。

2) 響應攔截器:該類攔截器的作用是在接收到服務器響應后統一執行某些操作,比如發現響應狀態碼為 401 時,自動跳轉到登錄頁。

2) 二次封裝配置代碼:(參考)

  1. import axios from 'axios'
  2. import qs from 'qs'
  3. /* 
  4.  * 根據環境變量區分接口的默認地址  
  5. */ 
  6. switch (process.env.NODE_ENV) { 
  7.     case "production"
  8.         axios.defaults.baseURL = "http://api.zhufengpeixun.cn"
  9.         break; 
  10.     case "test"
  11.         axios.defaults.baseURL = "http://192.168.20.12:8080"
  12.         break; 
  13.     default
  14.         axios.defaults.baseURL = "http://127.0.0.1:3000"
  15.  
  16. /* 
  17.  * 設置超時時間和跨域是否允許攜帶憑證  
  18. */ 
  19. axios.defaults.timeout = 10000; 
  20. axios.defaults.withCredentials = true
  21.  
  22. /* 
  23.  * 設置請求傳遞數據的格式(看服務器要求什么格式) 
  24.  * x-www-form-urlencoded 
  25. */ 
  26. axios.defaults.headers['Content-Type'] = 'application/x-www-form-urlencoded'
  27. axios.defaults.transformRequest = data => qs.stringify(data); 
  28.  
  29. /* 
  30.  * 設置請求攔截器  
  31.  * 客戶端發送請求 - > [請求攔截器] - > 服務器 
  32. * TOKEN校驗(JWT):接收服務器返回的token,存儲到vuex/本地存儲中,每一次向服務器發請求,我們應該把token帶上 
  33. */ 
  34. axios.interceptors.request.use(config => { 
  35.     // 攜帶上token 
  36.     let token = localStorage.getItem('token'); 
  37.     token && (config.headers.Authorization = token); 
  38.     return config; 
  39. }, error => { 
  40.    return Promise.reject(error); 
  41. }); 
  42.  
  43. /* 
  44.  * 響應攔截器  
  45.  * 服務器返回信息  -> [攔截的統一處理] -> 客戶端JS獲取到信息 
  46. */ 
  47. axios.defaults.validateStatus = status => { 
  48.     // 自定義響應成功的HTTP狀態碼 
  49.     return /^(2|3)\d{2}$/.test(status); 
  50. }; 
  51. axios.interceptors.response.use(response => { 
  52.     return response.data; 
  53. }, error => { 
  54.     let { 
  55.         response 
  56.     } = error; 
  57.     if (response) { 
  58.         //=>服務器最起碼返回結果了 
  59.         switch (response.status) { 
  60.             case 401: //=>權限 
  61.                 break; 
  62.             case 403: //=>服務器拒絕執行(token過期) 
  63.                 break; 
  64.             case 404: //=>找不到頁面  
  65.                 break; 
  66.         } 
  67.     } else { 
  68.         //=>服務器連結果都沒有返回 
  69.         if (!window.navigator.onLine) { 
  70.             // 斷網處理:可以跳轉到斷網頁面 
  71.             return
  72.         } 
  73.         return Promise.reject(error); 
  74.     } 
  75. }); 
  76. export default axios; 

 【編輯推薦】

 

責任編輯:姜華 來源: 前端學苑
相關推薦

2022-04-22 10:51:45

TSaxios前端

2021-07-27 14:50:15

axiosHTTP前端

2023-10-07 14:25:14

2020-10-19 19:05:20

VueAxiosAPI

2019-11-22 15:27:07

技術漏洞管理網絡

2019-11-24 23:39:01

漏洞管理漏洞風險

2020-05-06 09:25:10

微前端qiankun架構

2020-07-17 19:55:50

Vue前端性能優化

2017-08-08 10:01:20

項目管理敏捷實踐團隊

2023-09-05 08:21:07

項目CICD場景

2020-06-12 07:00:00

Web開發項目

2017-04-28 10:57:52

IT信息化服務器云計算

2023-08-28 07:28:41

項目領域層充血模型

2021-03-02 08:00:00

項目管理組織工具

2022-12-30 11:46:00

數據中臺

2024-04-18 09:20:43

PostgreSQL關系型數據庫數據庫管理系統

2022-09-28 12:39:46

axios攔截器

2021-06-10 16:05:17

DevOpsGitLab極狐

2014-08-20 09:40:56

大數據實踐項目

2022-05-09 09:28:04

Vite前端開發
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 成人深夜福利在线观看 | 久久精品中文 | 中文字幕亚洲精品 | 欧美日韩免费一区二区三区 | 亚洲不卡在线观看 | 成年人网站在线观看视频 | 国产色播av在线 | 午夜日韩精品 | 欧美区日韩区 | www.4虎影院 国产999精品久久久影片官网 | 国产视频第一页 | 久久九精品 | 国产片侵犯亲女视频播放 | 亚洲一区国产精品 | 欧美一区二区成人 | 日日躁狠狠躁aaaaxxxx | 午夜男人的天堂 | 久草热8精品视频在线观看 午夜伦4480yy私人影院 | 欧美中文在线 | 精品不卡| 五月激情婷婷六月 | 国产精品色哟哟网站 | 偷拍自拍网站 | 亚洲欧美日韩中文字幕一区二区三区 | 色婷婷综合久久久久中文一区二区 | 91在线网| 久久这里只有精品首页 | 不卡一区| 欧美1—12sexvideos | 午夜免费观看 | 一区二区在线观看av | 日韩激情一区 | 91九色婷婷| 99草免费视频 | 精久久久 | h在线看| 国产一区二区精品在线观看 | 国产精品久久久久久久久久久免费看 | 91九色porny首页最多播放 | 国产一区二区精华 | 日韩免费视频一区二区 |