亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

vue封裝axios的兩種方法總結(jié)

 更新時(shí)間:2023年10月25日 08:05:53   作者:前端技術(shù)棧  
在不同的前端項(xiàng)目中使用相同的axios封裝有利于保持一致性,有利于數(shù)據(jù)之間的傳遞和處理,本文主要提供兩種對(duì)axios進(jìn)行封裝的思路,有需要的小伙伴可以參考一下

作為前端工程師,經(jīng)常需要對(duì)axios進(jìn)行封裝以滿足復(fù)用的目的。在不同的前端項(xiàng)目中使用相同的axios封裝有利于保持一致性,有利于數(shù)據(jù)之間的傳遞和處理。本文提供兩種對(duì)axios進(jìn)行封裝的思路。

1. 將請(qǐng)求方式作為調(diào)用參數(shù)傳遞進(jìn)來(lái)

1.首先導(dǎo)入了axios, AxiosInstance和AxiosResponse模塊,用于創(chuàng)建一個(gè)http請(qǐng)求的實(shí)例和處理響應(yīng)結(jié)果。

2.定義了一個(gè)getBaseUrl函數(shù),用于獲取請(qǐng)求的基礎(chǔ)URL。

3.創(chuàng)建了httpProto實(shí)例,使用axios.create方法進(jìn)行創(chuàng)建。并配置了請(qǐng)求的超時(shí)時(shí)間為5000ms,不攜帶憑證,設(shè)置請(qǐng)求的Content-Type為application/json;charset=UTF-8,并允許跨域訪問(wèn)。

4.添加了一個(gè)請(qǐng)求攔截器,通過(guò)httpProto.interceptors.request.use方法,對(duì)請(qǐng)求進(jìn)行處理。首先使用getBaseUrl函數(shù)獲取基礎(chǔ)URL,并將其添加到請(qǐng)求的baseURL屬性中。然后通過(guò)getToken函數(shù)獲取憑證,如果憑證存在,則將其添加到請(qǐng)求的Authorization頭部字段中。最后返回處理后的請(qǐng)求配置。

5.添加了一個(gè)響應(yīng)攔截器,通過(guò)httpProto.interceptors.response.use方法,對(duì)響應(yīng)進(jìn)行處理。首先獲取響應(yīng)的data字段,然后判斷data.result的值,如果為0則表示請(qǐng)求成功,直接返回data。否則將返回一個(gè)失敗的Promise,reject的值為data。

6.定義了一個(gè)http函數(shù),用于發(fā)送請(qǐng)求。這個(gè)函數(shù)接收一個(gè)method參數(shù)和其他參數(shù)(rest),然后通過(guò)httpProto[method](...rest)的形式調(diào)用httpProto實(shí)例的對(duì)應(yīng)方法發(fā)送請(qǐng)求。

7定義了一個(gè)urls對(duì)象,用于存儲(chǔ)可供使用的URL路徑,其中有一個(gè)示例路徑example。

7.定義了一個(gè)methods對(duì)象,用于存儲(chǔ)常用的請(qǐng)求方法名稱,包括get、post和delete。

完整的代碼如下所示:

import axios, { AxiosInstance, AxiosResponse } from "axios";
import { getToken } from "./token";
 
// 獲取請(qǐng)求的基礎(chǔ)URL
const getBaseUrl = () => `http://${window.constant.serverIp}:8888}`;
 
// 創(chuàng)建http請(qǐng)求的實(shí)例對(duì)象
const httpProto: AxiosInstance = axios.create({
  timeout: 5000,
  withCredentials: false,
  headers: {
    'Content-Type': 'application/json;charset=UTF-8',
    'Access-Control-Allow-Origin': '*',
  }
});
 
// 添加請(qǐng)求攔截器
httpProto.interceptors.request.use((config: any) => {
  // 配置baseURL
  config.baseURL = getBaseUrl();
  // 獲取憑證
  const token = getToken();
  if (token) {
    // 如果有憑證就加上此憑證
    config.headers.Authorization = `${token}`;
  }
  return config;
}, (error) => {
  return Promise.reject(error)
});
 
// 添加響應(yīng)攔截器
httpProto.interceptors.response.use(
  (response: AxiosResponse) => {
    const { data } = response
    // 統(tǒng)一處理響應(yīng)結(jié)果
    if (data.result === 0) {
      return data;
    } else {
      return Promise.reject(data);
    }
  },
  (error) => {
    // 統(tǒng)一處理錯(cuò)誤信息
    return Promise.reject(error);
  }
);
 
// 將httpProto實(shí)例,也就是AxiosInstance實(shí)例對(duì)象封裝起來(lái)
const http = (method: string, ...rest: any) => {
  return httpProto[method](...rest);
}
 
// 可供使用的urls
const urls = {
  example: `/prod/example`,
}
 
const methods = {
  get: 'get',
  post: 'post',
  delete: 'delete',
}
 
export { http, urls, methods };

2. 直接調(diào)用某請(qǐng)求方式對(duì)應(yīng)的請(qǐng)求方法

1.導(dǎo)入了axios模塊的相關(guān)類型和函數(shù)。

2.定義了printLog函數(shù),用于處理日志輸出。

3.定義了IResponse接口,表示請(qǐng)求響應(yīng)對(duì)象的格式。

4.定義了RequestParams接口,表示發(fā)送請(qǐng)求的配置項(xiàng)的格式。

5.定義了IHttp接口,表示封裝對(duì)象支持的請(qǐng)求方式/方法。

6.定義了req對(duì)象,用于向外暴露支持的請(qǐng)求方法。

7.定義了methods數(shù)組,表示支持的請(qǐng)求方式類型。

8.使用forEach方法遍歷methods數(shù)組,逐步構(gòu)造req對(duì)象上的各個(gè)方法。

9.在每個(gè)方法的構(gòu)造過(guò)程中,進(jìn)行以下步驟:

  • 參數(shù)合并,將默認(rèn)的responseType設(shè)置為'json'。
  • 從params對(duì)象中解構(gòu)需要的參數(shù)。
  • 使用axios.create方法創(chuàng)建一個(gè)AxiosInstance實(shí)例對(duì)象。
  • 創(chuàng)建請(qǐng)求頭對(duì)象,并設(shè)置一些常用的請(qǐng)求頭信息。
  • 構(gòu)造請(qǐng)求配置對(duì)象AxiosRequestConfig。
  • 根據(jù)請(qǐng)求方式對(duì)請(qǐng)求配置進(jìn)行修正,主要是將data賦值到相應(yīng)的字段中。
  • 添加請(qǐng)求攔截器,并在成功和失敗的情況下返回配置。
  • 添加響應(yīng)攔截器,并在成功和失敗的情況下返回處理結(jié)果。
  • 構(gòu)造請(qǐng)求成功的回調(diào)函數(shù),對(duì)返回?cái)?shù)據(jù)進(jìn)行格式化的操作。
  • 構(gòu)造請(qǐng)求失敗的回調(diào)函數(shù),處理錯(cuò)誤日志和斷網(wǎng)情況。
  • 發(fā)送請(qǐng)求并將請(qǐng)求結(jié)果作為函數(shù)的返回值。

10.默認(rèn)導(dǎo)出req對(duì)象。

以下是加上注釋的完整代碼:

import axios, { AxiosRequestConfig, AxiosResponse, AxiosError } from 'axios';
 
// 日志處理,可定制
const printLog = console;
 
// 作為被Promise包裹的請(qǐng)求響應(yīng)對(duì)象的格式
export interface IResponse {
  code: number;
  msg: string;
  result: {
    lastOperaTime: number;
    data: any;
  };
}
 
// 發(fā)送請(qǐng)求的配置項(xiàng)的格式
export interface RequestParams {
  url: string;
  baseUrl?: string;
  data?: object;
  filter?: boolean;
  responseType?: 'arraybuffer' | 'blob' | 'document' | 'json' | 'text' | 'stream';
  headers?: any;
  timeout?: number;
}
 
// 封裝對(duì)象支持的請(qǐng)求方式/方法
interface IHttp {
  get?: (params: RequestParams) => Promise<any>;
  post?: (params: RequestParams) => Promise<any>;
  put?: (params: RequestParams) => Promise<any>;
  patch?: (params: RequestParams) => Promise<any>;
  delete?: (params: RequestParams) => Promise<any>;
}
 
// 支持的請(qǐng)求方式類型
export type HttpMethod = 'get' | 'post' | 'put' | 'patch' | 'delete';
 
// 向外暴露出去的對(duì)象
const req: IHttp = {};
 
// 支持的請(qǐng)求類型
const methods: HttpMethod[] = ['get', 'post', 'put', 'patch', 'delete'];
 
// 遍歷methods數(shù)組,逐步構(gòu)造req對(duì)象
methods.forEach((_m: HttpMethod) => {
  // 使用遍歷的方式對(duì)req對(duì)象上的各個(gè)方法進(jìn)行構(gòu)造
  req[_m] = (params: RequestParams) => {
    // 1. 構(gòu)造參數(shù)合并
    params = {
      ...params,
      responseType: params.responseType || 'json',
    };
 
    // 2. 從使用對(duì)象方法的形參上結(jié)構(gòu)出必要的參數(shù)
    const {
      url, // 服務(wù)器地址
      data, // 有效載荷
      filter = true, // 過(guò)濾器
      responseType, // 返回類型
      timeout, // 超時(shí)時(shí)間
    } = params;
 
    // 3. 使用axios創(chuàng)建AxiosInstance實(shí)例對(duì)象
    const instance = axios.create({
      baseURL: params.baseUrl ?? `http://${window.location.hostname}`,
      timeout,
    });
 
    // 4. 創(chuàng)建請(qǐng)求頭對(duì)象
    const headers = {
      lastOperaTime: Date.now(), // 時(shí)間戳
      token: getToken(), // 憑證
      lang: getLocalLocale(), // 語(yǔ)言
      Accept: 'application/json', // 接受返回?cái)?shù)據(jù)的類型
      'Content-Type': 'application/json; charset=utf-8', // 內(nèi)容格式
    };
 
    // 5. 請(qǐng)求配置
    const axiosConfig: AxiosRequestConfig = {
      method: _m, // 請(qǐng)求方法
      url, // 服務(wù)器地址
      headers: {
        // 合并請(qǐng)求頭
        ...headers,
        ...(params.headers || {}),
      },
      responseType, // 返回值類型
    };
 
    // 6. 針對(duì)不同的請(qǐng)求類型需要對(duì)請(qǐng)求配置進(jìn)行修正
    if (data) {
      // 對(duì)于有效載荷,不同的請(qǐng)求方式攜帶信息的方式是不同的,在這里做了區(qū)分
      if (_m === 'get') {
        axiosConfig.params = data;
      } else if (data instanceof FormData) {
        axiosConfig.data = data;
      } else {
        axiosConfig.data = data;
      }
    }
 
    // 添加請(qǐng)求攔截器
    instance.interceptors.request.use(
      // 占位
      (config: any) => {
        return config;
      },
      // 失敗則返回失敗
      (error: any) => {
        return Promise.reject(error);
      }
    );
 
    // 7. 添加響應(yīng)攔截器
    instance.interceptors.response.use(
      // 成功的回調(diào),將發(fā)起請(qǐng)求的參數(shù)作為第二參數(shù)回傳
      (res: any) => handleSuccess(res, params),
      // 失敗的回調(diào),將發(fā)起請(qǐng)求的參數(shù)作為第二參數(shù)回傳
      (err: any) => handleError(err, params)
    );
 
    // 8. 構(gòu)造請(qǐng)求成功的回調(diào)函數(shù) -- 主要是對(duì)返回?cái)?shù)據(jù)進(jìn)行格式化的操作
    function handleSuccess(response: AxiosResponse<IResponse>, requestParams: RequestParams) {
      if (response.data) {
        // 解構(gòu)數(shù)據(jù)
        const { code, msg, result } = response.data;
        if (code !== 0) {
          printLog.error(msg);
        }
 
        return filter ? result?.data ?? result : response.data;
      } else {
        printLog.error('incorrect data format');
        return response.data;
      }
    }
 
    // 9. 構(gòu)造請(qǐng)求失敗的回調(diào)函數(shù)
    function handleError(err: AxiosError, requestParams: RequestParams) {
      if (err.response) {
        printLog.error(`api: ${requestParams.url}: ${err.response.status}`);
      }
      if (err instanceof Error) {
        if (err.message) {
          printLog.error(err.message);
        }
      }
      if (!window.navigator.onLine) {
        // 處理斷網(wǎng)情況
        printLog.error('netwrok error');
      }
      return Promise.reject(err);
    }
 
    // 10. 發(fā)送請(qǐng)求并將請(qǐng)求結(jié)果(Promise對(duì)象)作為函數(shù)的返回值
    return instance.request(axiosConfig);
  };
});
 
export default req;

到此這篇關(guān)于vue封裝axios的兩種方法總結(jié)的文章就介紹到這了,更多相關(guān)vue封裝axios內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Vue Element前端應(yīng)用開發(fā)之echarts圖表

    Vue Element前端應(yīng)用開發(fā)之echarts圖表

    在我們做應(yīng)用系統(tǒng)的時(shí)候,往往都會(huì)涉及圖表的展示,綜合的圖表展示能夠給客戶帶來(lái)視覺的享受和數(shù)據(jù)直觀體驗(yàn),同時(shí)也是增強(qiáng)客戶認(rèn)同感的舉措之一
    2021-05-05
  • vue中返回結(jié)果是promise的處理方式

    vue中返回結(jié)果是promise的處理方式

    這篇文章主要介紹了vue中返回結(jié)果是promise的處理方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-04-04
  • 淺析webpack-bundle-analyzer在vue-cli3中的使用

    淺析webpack-bundle-analyzer在vue-cli3中的使用

    這篇文章主要介紹了webpack-bundle-analyzer在vue-cli3中的使用,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-10-10
  • vue之webpack -v報(bào)錯(cuò)解決方案總結(jié)

    vue之webpack -v報(bào)錯(cuò)解決方案總結(jié)

    這篇文章主要介紹了vue之webpack -v報(bào)錯(cuò)解決方案總結(jié),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-09-09
  • vue3的ref,computed,reactive和toRefs你都了解嗎

    vue3的ref,computed,reactive和toRefs你都了解嗎

    這篇文章主要為大家詳細(xì)介紹了vue3的ref,computed,reactive和toRefs,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2022-03-03
  • vue 如何實(shí)現(xiàn)表單校驗(yàn)

    vue 如何實(shí)現(xiàn)表單校驗(yàn)

    這篇文章主要介紹的是vue 如何實(shí)現(xiàn)表單校驗(yàn)的方法,又代碼詳細(xì)解說(shuō),感興趣的小伙伴可以參考下面文章的具體內(nèi)容
    2021-09-09
  • Vue常用API、高級(jí)API的相關(guān)總結(jié)

    Vue常用API、高級(jí)API的相關(guān)總結(jié)

    這篇文章主要介紹了Vue常用API、高級(jí)API的相關(guān)總結(jié),幫助大家更好的理解和學(xué)習(xí)使用vue框架,感興趣的朋友可以了解下
    2021-02-02
  • 使用?Vue3?實(shí)現(xiàn)文章目錄功能

    使用?Vue3?實(shí)現(xiàn)文章目錄功能

    本文給大家分享如何使用vue3實(shí)現(xiàn)文章目錄功能,特色功能主要是自動(dòng)高亮選中當(dāng)前正在閱讀的章節(jié),自動(dòng)展開當(dāng)前正在閱讀的章節(jié)的子標(biāo)題,并隱藏其他章節(jié)的子標(biāo)題,代碼簡(jiǎn)單易懂,感興趣的朋友跟隨小編一起看看吧
    2022-03-03
  • vue3配置router路由并實(shí)現(xiàn)頁(yè)面跳轉(zhuǎn)功能

    vue3配置router路由并實(shí)現(xiàn)頁(yè)面跳轉(zhuǎn)功能

    這篇文章主要介紹了vue3配置router路由并實(shí)現(xiàn)頁(yè)面跳轉(zhuǎn),本文通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-04-04
  • Vue Element-ui實(shí)現(xiàn)樹形控件節(jié)點(diǎn)添加圖標(biāo)詳解

    Vue Element-ui實(shí)現(xiàn)樹形控件節(jié)點(diǎn)添加圖標(biāo)詳解

    這篇文章主要為大家介紹了Element-ui實(shí)現(xiàn)樹形控件節(jié)點(diǎn)添加圖標(biāo),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2021-11-11

最新評(píng)論