axios口味芝士

来源:https://www.cnblogs.com/constLi/archive/2022/04/28/15963626.html
-Advertisement-
Play Games

一、一體化運營平臺前端請求部分 1.介面封裝 一體化運營平臺採用的是封裝axios的方式來簡化請求介面的使用,在添加新介面時只要調用封裝好的方法就可以發出請求並直接得到解析後的數據 2.整個過程解析 (1)請求方法調用request方法並傳需要的參數 sync_collect_diff_data(d ...


一、一體化運營平臺前端請求部分
1.介面封裝
一體化運營平臺採用的是封裝axios的方式來簡化請求介面的使用,在添加新介面時只要調用封裝好的方法就可以發出請求並直接得到解析後的數據
2.整個過程解析
(1)請求方法調用request方法並傳需要的參數

     sync_collect_diff_data(data) {
    return request({
      url: '/resource-server/collection/sync_collect_diff_data', //請求路徑
      method: 'post',//請求方式,這裡是後面自己設置的,不是常規意義上的get/post
      Data //請求參數
    })
  }

(2)request方法進入到until目錄下的request.js方法類

// create an axios instance
const service = axios.create({
  baseURL: process.env.BASE_API, // api 的 base_url
  timeout: 60000 // request timeout
})

創建一個axios實例,其中baseURL是配置在其它文件中,主要用來區分開發環境和測試環境等
(3)給axios實例設置請求頭

axios.interceptors.request.use(config => {
  if (sessionStorage.getItem('accessToken')) {
    config.headers.accessToken = sessionStorage.getItem('accessToken')
  }
  if (sessionStorage.getItem('clientId')) {
    config.headers.clientId = sessionStorage.getItem('clientId')
  }
  if (sessionStorage.getItem('csrfToken')) {
    config.headers.csrfToken = sessionStorage.getItem('csrfToken')
  }
  if (sessionStorage.getItem('loginName')) {
    config.headers.loginName = sessionStorage.getItem('loginName')
  }
  return config
});

請求發起時會附帶上在這裡面設置的參數,表現形式為以下

(4)設置接收方法

  axios.interceptors.response.use((response) => {
  if (response.data.errCode === 990014) {
    router.push('/')
  }
 ...
}

接收方法中可以設置對接受到的response數據進行加工解析,以及錯誤處理,在這個過程中可以和後端約定幾種通用的處理方式,例如在檢測到登錄信息缺失等時自動彈出到登錄界面
(5)拋出特定類型的接收數據解析方法

  get(url, params = {}) {
    return new Promise((resolve, reject) => {
      axios.get(process.env.API_ROOT + url, { params }).then(res => {
        if (res) {
          if (res.data.errCode === 0) {
            resolve(res.data.data);
          } else {
            reject(res.data.errMsg);
          }
        }
      }).catch(error => {
        reject(error);
      })
    })
  },

此類型方法需要通過export來拋出,同時方法名就是之前調用request方法時候的類型,
在此方法中resolve代表成功的情況,此時方法會將數據返回給調用方,reject方法則代表失敗的情況下返回的數據,需要註意的一點是方法返回無論成功還是失敗,是先經過上面設定的攔截器,所以如果上面攔截器處理之後,就不會到這邊方法的處理流程中
二、Axios知識學習
一、axios的封裝
在vue項目中,和後臺交互獲取數據這塊,我們通常使用的是axios庫,它是基於promise的http庫,可運行在瀏覽器端和node.js中。他有很多優秀的特性,例如攔截請求和響應、取消請求、轉換json、客戶端防禦XSRF等。
1.安裝導入

npm install axios; // 安裝axios
一般會在項目的src目錄中,新建一個request文件夾,然後在裡面新建一個http.js和一個api.js文件。http.js文件用來封裝我們的axios,api.js用來統一管理我們的介面。

// 在http.js中引入axios
import axios from 'axios'; // 引入axios
import QS from 'qs'; // 引入qs模塊,用來序列化post類型的數據,後面會提到

2.環境的切換
通過node的環境變數來匹配我們的預設的介面url首碼。axios.defaults.baseURL可以設置axios的預設請求地址

// 環境的切換
if (process.env.NODE_ENV == 'development') {    
    axios.defaults.baseURL = 'https://www.baidu.com';} 
else if (process.env.NODE_ENV == 'debug') {    
    axios.defaults.baseURL = 'https://www.ceshi.com';
} 
else if (process.env.NODE_ENV == 'production') {    
    axios.defaults.baseURL = 'https://www.production.com';
}

在一體化中是通過分文件拋出的方式

3.設置請求超時
通過axios.defaults.timeout設置預設的請求超時時間。例如超過了10s,就會告知用戶當前請求超時,請刷新等。
axios.defaults.timeout = 10000;
4.post請求頭的設置
post請求的時候,我們需要加上一個請求頭,所以可以在這裡進行一個預設的設置,即設置post的請求頭為
application/x-www-form-urlencoded;charset=UTF-8
axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded;charset=UTF-8';
5.請求攔截
我們在發送請求前可以進行一個請求的攔截,為什麼要攔截呢,我們攔截請求是用來做什麼的呢?比如,有些請求是需要用戶登錄之後才能訪問的,或者post請求的時候,我們需要序列化我們提交的數據。這時候,我們可以在請求被髮送之前進行一個攔截,從而進行我們想要的操作。一體化中使用這塊設定了許可權校驗,也就是crftoken等

// 先導入vuex,因為我們要使用到裡面的狀態對象
// vuex的路徑根據自己的路徑去寫
import store from '@/store/index';
// 請求攔截器axios.interceptors.request.use(    
    config => {        
        // 每次發送請求之前判斷vuex中是否存在token        
        // 如果存在,則統一在http請求的header都加上token,這樣後臺根據token判斷你的登錄情況
        // 即使本地存在token,也有可能token是過期的,所以在響應攔截器中要對返回狀態進行判斷 
        const token = store.state.token;        
        token && (config.headers.Authorization = token);        
        return config;    
    },  error => {        
        return Promise.error(error);    
})

這裡說一下token,一般是在登錄完成之後,將用戶的token通過localStorage或者cookie存在本地,然後用戶每次在進入頁面的時候(即在main.js中),會首先從本地存儲中讀取token,如果token存在說明用戶已經登陸過,則更新vuex中的token狀態。然後,在每次請求介面的時候,都會在請求的header中攜帶token,後臺人員就可以根據你攜帶的token來判斷你的登錄是否過期,如果沒有攜帶,則說明沒有登錄過。

響應攔截器很好理解,就是伺服器返回給我們的數據,我們在拿到之前可以對他進行一些處理。例如上面的思想:如果後臺返回的狀態碼是200,則正常返回數據,否則的根據錯誤的狀態碼類型進行一些我們需要的錯誤,其實這裡主要就是進行了錯誤的統一處理和沒登錄或登錄過期後調整登錄頁的一個操作。

6.封裝get方法和post方法
我們常用的ajax請求方法有get、post、put等方法,相信小伙伴都不會陌生。axios對應的也有很多類似的方法,不清楚的可以看下文檔。但是為了簡化我們的代碼,我們還是要對其進行一個簡單的封裝。下麵我們主要封裝兩個方法:get和post。
get方法:我們通過定義一個get函數,get函數有兩個參數,第一個參數表示我們要請求的url地址,第二個參數是我們要攜帶的請求參數。get函數返回一個promise對象,當axios其請求成功時resolve伺服器返回 值,請求失敗時reject錯誤值。最後通過export拋出get函數。
post方法:原理同get基本一樣,但是要註意的是,post方法必須要使用對提交從參數對象進行序列化的操作,所以這裡我們通過node的qs模塊來序列化我們的參數。這個很重要,如果沒有序列化操作,後臺是拿不到你提交的數據的。

這裡有個小細節說下,axios.get()方法和axios.post()在提交數據時參數的書寫方式還是有區別的。區別就是,get的第二個參數是一個{},然後這個對象的params屬性值是一個參數對象的。而post的第二個參數就是一個參數對象。兩者略微的區別要留意

7.封裝配置的優點
1.通過直接引入我們封裝好的axios實例,然後定義介面、調用axios實例並返回,可以更靈活的使用axios,比如你可以對post請求時提交的數據進行一個qs序列化的處理等。
2.請求的配置更靈活,你可以針對某個需求進行一個不同的配置。關於配置的優先順序,axios文檔說的很清楚,這個順序是:在 lib/defaults.js 找到的庫的預設值,然後是實例的 defaults 屬性,最後是請求的 config 參數。後者將優先於前者。
3.restful風格的介面,也可以通過這種方式靈活的設置api介面地址。

三、一體化後端請求部分
1.後端流程
登錄過程中後端會生成accessToken和clientId用來進行許可權校驗工作,也就是之前寫到的在請求頭中設定這兩項的目的,如果是被標記為需要許可權校驗的介面,則會校驗第三項,也就是csrfToken。根據校驗結果來決定是否調用實際方法,如果是不需要校驗的介面則會直接進入實際方法
2.後端請求封裝
後端響應請求時也進行了部分封裝,主要體現在路由,許可權校驗
(1)路由:一體化在系統相關後端上是採用的分模塊部署的,具有一個統一的路由,通過這個統一路由來提供一個統一對外介面,這就導致在請求時存在一個註意事項,與常規spring+mybatis路由不同,還需要加上一層模塊名字路由
/resource-server/collection/delete_collect_cfg_data
/模塊名/類層級路由/方法級路由
(2)許可權校驗:許可權校驗這塊採用的時AOP切麵,環繞通知的方式來封裝實現的,通過在介面上增加一個 @AuthPlugin來開啟許可權校驗,許可權校驗流程簡單來說分問兩個層級,第一級校驗是否是有效用戶,這塊採用的是ceftoken比對來確認,第二層則是確認是否有許可權訪問當前介面,這塊則是讀表的方式來確認

 // 只攔截使用了 @AuthPlugin 註解的方法
  AuthPlugin authPlugin = method.getAnnotation(AuthPlugin.class);
 if (authPlugin == null) {
    return joinPoint.proceed();
 }

@AuthPlugin(serviceCode = "model-cancel", logLevel = LogRecordLevel.NO_NEED)
參數意義:服務名,這個需要和給用戶配置的服務許可權一致;日誌級別,許可權校驗同時集成了日誌輸出功能,所以需要區分日誌級別

本文來自博客園,作者:李李李的博客,轉載請註明原文鏈接:https://www.cnblogs.com/constLi/p/15963626.html


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 想必大家在做網頁表格的時候一定遇到過這種情況吧 表格出現了“雙線”,但是我們需要一個“單線”的表格 比較常用的解決方案 解決方案1: 在表格的樣式中添加border-collapse: collapse;以設置邊框合併(如果border-collapse的屬性值為collapse,則會忽略 bord ...
  • 一 、通過雲開發平臺快速創建初始化應用 1.創建相關應用模版請參考鏈接: Hexo博客框架—輕量、一令部署 2.完成創建後就可以在github中查看到新增的Hexo倉庫 二 、 本地編寫《賽博朋克風格》個人博客 1.將應用模版克隆到本地 ● 首先假定你已經安裝了Git、node,沒有安裝請移步nod ...
  • 先說一些廢話 之前學習Nodejs項目的時候使用了pm2作為生產環境的進程管理工具,最近伺服器崩了需要重啟一些服務,發現有些命令記得不是特別清楚, 所以這裡寫一篇文章幫助自己記憶整理一下pm2的常用命令,後續有需要查閱一下即可~ 常用命令 進入bin目錄啟動:pm2 start www / pm2 ...
  • 為什麼要使用Hexo Hexo 是一個快速、簡潔且高效的博客框架。Hexo 使用 Markdown(或其他渲染引擎)解析文章,在幾秒內,即可利用靚麗的主題生成靜態網頁。Hexo支持Github Flavored Markdown的所有功能, 甚至可以整合Octopress的大多數插件. 並自己也擁有 ...
  • 首先我要說明一下,沒錯,還是沒有進入vue,劉備請諸葛亮三次都可以了吧,我這也是第三次了,也絕對是最後一次了,我應經摸透了因為,最後的webpack打包加上一個git學了過後我就去vue了。 為什麼要說先看這篇,其實跟我們今天的主題webpack沒有太大關係,昨天學了一下webpack,其實內容沒多 ...
  • CSS 陰影的存在,讓物體看上去更加有型立體。 然而,在最簡單的陰影使用之上,我們可以實現更多有意思且更加立體的陰影效果。 本文將帶大家看看如何使用 CSS 實現幾類比普通陰影更加立體的陰影效果。 CSS 陰影基礎 CSS 中,明面上可以實現陰影的有三個屬性: box-shadow - 盒陰影 te ...
  • 這裡給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 1. 對閉包的理解 閉包是指有權訪問另一個函數作用域中變數的函數,創建閉包的最常見的方式就是在一個函數內創建另一個函數,創建的函數可以訪問到當前函數的局部變數。 閉包有兩個常用的用途; 閉包的第一個用途是使我們在函數外部能夠訪問到函數內部 ...
  • 這裡給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 1. 對原型、原型鏈的理解 在JavaScript中是使用構造函數來新建一個對象的,每一個構造函數的內部都有一個 prototype 屬性,它的屬性值是一個對象,這個對象包含了可以由該構造函數的所有實例共用的屬性和方法。當使用構造函數新建 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...