NuxtJS中網絡請求模塊的封裝與最佳實戰

在網絡開發中,封裝一個簡潔、高效的網絡請求模塊對于項目的可維護性和擴展性至關重要。本文將詳細介紹如何在NuxtJS中封裝一個通用的網絡請求模塊,并結合最佳實踐來說明如何使用它來進行網絡請求。

良好的代碼結構和封裝,不但結構清晰還能夠大幅提高開發效率。下面以實戰為例,以獲取用戶排行榜頁面的完整實現為實戰背景,詳細介紹下NuxtJS中網絡請求的封裝與最佳實戰。

如下圖所示,右側為用戶排行榜的實現效果展示。本文詳細展示網絡請求的模塊化封裝和在具體頁面上的網絡接口使用。

在這里插入圖片描述

封裝網絡請求模塊

首先,引入所需的庫和工具函數。使用getTokendelToken來處理用戶的認證令牌。封裝一個網絡請求的工具方法。

//hooks/userToken.ts
import { useCookie } from '#app'// 獲取 Token
export const getToken = () => {const Token = useCookie('hw_token')return Token.value
}// 設置 Token
export const setToken = (val: string) => {const Token = useCookie('hw_token')Token.value = val
}// 清空 Token
export const delToken = () => {const Token = useCookie('hw_token')Token.value = null
}

工具類封裝:

// utils/request.ts
import { getToken, delToken } from '@/hooks/useToken'
// import { getUuid } from '@/hooks/useUuid'type CommonObject = Record<string, unknown>// 封裝請求
// 指定后端返回的基本數據類型
export interface ResponseConfig {code: numberdata: CommonObjectmessage: string
}const CodeConfig = {/*** 接口錯誤信息*/// code failCodeFail: 1,// code successCodeSuc: 0,// request param errorCodeParamError: 1001,// account is existCodePhoneExist: 1002,// server internal errorCodeServerError: 1003,// token expiredCodeTokenExpired: 1004,// user not existCodeUserNotExist: 1005,// password errorCodePasswordError: 1006,// article not existCodeArticleNotExist: 2000
}// 參數排序
function sortKey(s1, s2) {if (s1 < s2) {return -1}if (s1 > s2) {return 1}return 0
}
// 參數排序
function getSortObj(originData) {const originKeys = Object.keys(originData)const sortKeys = originKeys.sort(sortKey)const sortObj = sortKeys.reduce((p, n) => {return { ...p, [n]: originData[n] }}, {})return sortObj
}const defaultOption = {// key: () => Math.random(),// lazy: true,// baseURL: process.env.BASE_URL,headers: {Authorization: '',token: '',// ts: (+new Date() / 1000) | 0,// sign: '',// 'Content-Type': 'application/x-www-form-urlencoded',// deviceType: 'pc'}
}const fetch = (url: string, options?: CommonObject): Promise<ResponseConfig> => {const { $router, $config } = useNuxtApp()const reqUrl = $config.public.BASE_URL + urlconst p: CommonObject = {...defaultOption,...options}// 加密參數const originData = options?.body || options?.params || {}const sortData = getSortObj(originData)let paramsData = JSON.stringify(sortData)if (p.method === 'get') {Object.assign(p, { params: sortData })} else {const qsData = JSON.stringify(sortData)Object.assign(p, { body: qsData })paramsData = qsData}
//   const encryStr = CryptoJS.MD5(decodeURIComponent(paramsData)).toString()const Token = getToken()Object.assign(p.headers as object, {Authorization: Token ? `Bearer ${Token}` : '',token: Token || '',// ts: (+new Date() / 1000) | 0,// sign: encryStr,// uuid: getUuid()})return new Promise((resolve, reject) => {$fetch(reqUrl, p).then((res) => {const code = (res as ResponseConfig).code || 0if (code === CodeConfig.CodeSuc) {// 成功resolve(res as ResponseConfig)return}if (code === CodeConfig.CodeTokenExpired) {// token過期delToken()$router.replace({ path: '/' })reject(res)return}if (code !== CodeConfig.CodeSuc) {reject(res)return}}).catch((err) => {reject(err)})})
}export default {get<T = ResponseConfig>(url: string, params?: CommonObject): Promise<T> {return fetch(url, { method: 'get', params }) as Promise<T>},post<T = ResponseConfig>(url: string, body?: CommonObject): Promise<T> {return fetch(url, { method: 'post', body }) as Promise<T>},put<T = ResponseConfig>(url: string, body?: CommonObject): Promise<T> {return fetch(url, { method: 'put', body }) as Promise<T>},delete<T = ResponseConfig>(url: string, body?: CommonObject): Promise<T> {return fetch(url, { method: 'delete', body }) as Promise<T>}
}
網絡請求組件的介紹

在這個封裝中,定義了四個主要的請求方法:getpostputdelete。這些方法分別對應于HTTP協議中的GET、POST、PUT和DELETE操作。

  • get: 用于獲取數據,通常是在URL后面添加查詢參數。
  • post: 用于提交數據到服務器,通常用于創建新資源。
  • put: 用于更新服務器上的數據,通常用于更新現有資源。
  • delete: 用于刪除服務器上的數據,通常用于刪除資源。
結合TypeScript的最佳實踐

為了更好地組織代碼和利用TypeScript的類型系統,建議將網絡請求和響應的結構體定義單獨放在一個文件中,比如types.ts,然后在API文件夾中定義具體的網絡請求接口。

以獲取用戶排行榜接口為例:

定義請求和響應類型
// types.ts
// 定義通用對象類型
type CommonObject = Record<string, unknown>;// 定義獲取用戶榜單的請求和響應類型
// 定義接口參數類型
interface GetUserRankingParams extends CommonObject {limit?: number;types?: number;
}// 定義單個用戶的排行榜數據類型
interface UserRanking {userName: string;nickname: string;avatarName: string;registDate: string;avatarUrl: string;articleCount: number;totalViews: number;totalComments: number;lastPostTime: string;score: number;
}// 定義響應數據類型
interface UserRankingResponse {code: number;msg: string;data: UserRanking[];
}
定義API接口

使用上述定義的類型,可以更清晰地定義API接口。將這些接口放在一個單獨的文件中,比如api/index.ts

// api/index.ts
import request from '@/utils/request'
import { GetUserRankingParams, UserRankingResponse } from '@/types'/*** 獲取用戶排行榜API接口定義*/
export const getUserRank = (params?: GetUserRankingParams): Promise<UserRankingResponse> => {return request.get('/userRank', params)
}
使用封裝后的API

在NuxtJS的組件或者其他文件中,可以這樣使用封裝后的API接口:

<script setup lang="ts">
import { getUserRank } from '@/api/index'
import { UserRankingResponse } from '@/types'// 使用GET請求獲取數據
const fetchData = async () => {try {const response: UserRankingResponse = await getUserRank({ limit: 10, types: 1 })console.log(response.data)} catch (error) {console.error(error)}
}// 調用相應的方法
fetchData()
</script>

在VUE頁面的詳細使用

<template><div class="footer"><div><div class="qrcode-scan"><img src="@/assets/img/hw_qrcode.jpg" class="qrcode-img"><div class="qrcode-text"><h2 class="qrcode-title">關注堅果派公眾號</h2><p class="qrcode-des">鴻蒙專屬的技術社區</p></div></div><div class="sider-box"><h5 class="common-title">作者榜</h5><div class="content-box"><div><div v-for="user in rankList" :key="user.userName" class="author-item"><img :src="user.avatarUrl+user.avatarName" :alt="user.nickname" width="34" height="34" class="avatar"><NuxtLink :to="`/user/${user.userName}`" class="author-info" target="_blank" rel="noopener noreferrer"><span class="name single-ellipsis">{{ user.nickname }}</span><span class="count single-ellipsis">{{ user.articleCount }}篇文章</span></NuxtLink><a-button class="follow-btn"><span class="normal">關注</span><span class="cancel">取消關注</span></a-button></div></div></div></div></div></div>
</template><script lang="ts" setup>import { getCourselist ,getUserRank} from '~/api'const rankList = ref<UserRanking[]>([]);const fetchUserRanking = async () => {try {const params: GetUserRankingParams = {limit: 7,type: 0};const result: UserRankingResponse = await getUserRank(params);//console.log('User ranking response:', result);if (result.code === 0) {rankList.value = result.data;} else {console.error('用戶排行榜請求失敗,代碼:', result.code, '消息:', result.msg);}} catch (error: any) {console.error('獲取用戶排行榜時發生錯誤:');if (error instanceof Error) {console.error('錯誤信息:', error.message);} else {console.error('未知錯誤:', error);}}
};fetchUserRanking()
</script>
結語

通過上述封裝和最佳實踐,在NuxtJS項目中可以更方便地進行網絡請求,并且能夠集中處理一些通用的邏輯,比如錯誤處理和認證信息的傳遞。將網絡請求和響應類型定義集中放在一個文件中,不僅使得我們的代碼更加整潔,還提高了代碼的可維護性和可讀性。這樣的封裝方式使得我們的項目結構更加清晰,并且易于擴展和維護。希望這篇文章能夠幫助你在NuxtJS項目中實現高效的網絡請求管理。

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

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

相關文章

云歸子批量混剪軟件批量剪輯軟件批量分割視頻更新記錄

www.yunguizi.com 優化顯卡硬件加速配置 ? 優化 2025年07月07日 版本 v1.1.6 優化顯卡硬件加速配置 修復了一些重要內容 &#x1f41b; 修復 2025年07月06日 版本 v1.1.6 修復了一些重要內容 重構讀寫機制 ? 優化 2025年07月06日 版本 v1.1.6 優化了一些重要內容&#xff1b;…

SpringBoot校園外賣服務系統設計與實現源碼

概述 基于SpringBoot開發的校園外賣服務系統&#xff0c;實現了從外賣管理到訂單處理的全流程數字化解決方案&#xff0c;包含外賣管理、訂單處理、用戶管理等全方位功能。 主要內容 核心功能模塊&#xff1a; ??個人信息管理??&#xff1a; 修改密碼個人信息修改 ??…

東軟8位MCU低功耗調試總結

簡介主控選用8位ES7P7021&#xff0c;應用于磁吸無線充電場景&#xff0c;有一個雙向C口&#xff08;IP5219&#xff09;&#xff0c;MCU控制電量燈顯示&#xff0c;通過IIC控制C口的降額&#xff0c;插入TYPE-C線之后有一個外部中斷信號&#xff0c;觸發MCU喚醒&#xff0c;開…

什么是 3D 文件?

3D 文件是 3D 對象的數字表示形式&#xff0c;可以在計算機輔助設計 &#xff08;CAD&#xff09; 軟件中創建或編輯。它們包含有關物體的形狀、大小和結構的信息&#xff0c;對 3D 打印過程至關重要。3D 文件格式允許在不同的程序和打印機之間交換 3D 模型&#xff0c;并確定模…

語言模型 RLHF 實踐指南(一):策略網絡、價值網絡與 PPO 損失函數

在使用 Proximal Policy Optimization&#xff08;PPO&#xff09;對語言模型進行強化學習微調&#xff08;如 RLHF&#xff09;時&#xff0c;大家經常會問&#xff1a; 策略網絡的動作概率是怎么來的&#xff1f;價值網絡的得分是如何計算的&#xff1f;獎勵從哪里來&#xf…

日常--記一次gitlab Runner配置與CI/CD環境搭建流程

文章目錄一、前言二、相關知識1.相關定義1.什么是 CI&#xff1f;2.什么是 CD&#xff1f;2.CI/CD 構建塊與工具鏈3.為什么要使用 CI/CD&#xff1f;三、準備四、實現1.Runner安裝與配置1.更新源2.安裝Runner3.注冊Runner4.啟動Runner5.查看Runner信息2.CI/CD流程測試1.CI/CD構…

東方仙盟AI數據中間件使用教程:開啟數據交互與自動化應用新時代——仙盟創夢IDE

一、啟動未來之窗AI 二、初始化數據接口三、便捷接口數據進入東方仙盟獲取接口標準四、同步參數仙界界牌&#xff0c;冥界界牌&#xff0c;仙盟界牌 五、開始同步六、東方仙盟青云劍魂架構在當今數字化浪潮下&#xff0c;數據的采集、處理與傳輸成為眾多應用場景的核心需求。而…

Rust 仿射類型(Affine Types)

在 Rust 中&#xff0c;仿射類型&#xff08;Affine Types&#xff09; 是所有權系統的理論基礎&#xff0c;它規定了每個值有且僅有一次使用機會。這與線性類型&#xff08;必須恰好使用一次&#xff09;有所不同&#xff0c;允許值未被使用就被丟棄。Rust 中的仿射類型核心特…

python庫 arrow 庫的各種案例的使用詳解(更人性化的日期時間處理)

文章目錄 一、arrow概述1.1 arrow介紹1.2 安裝 arrow1.3 注意事項二、基本使用2.1 創建 Arrow 對象2.2 格式化輸出2.3 時間運算三、高級功能3.1 時區處理3.2 時間范圍3.3 時間間隔四、實際應用案例4.1 日志時間處理4.2 會議時間提醒4.3 國際化時間顯示5. Arrow 與 datetime 互操…

window 服務器上部署前端靜態資源以及nginx 配置

最近搞了一臺境外服務器 這種境外服務器是不可以配置域名的 但是可以使用ip訪問 但是如果需要 配置 需要下載nginx nginx: download 我這個是windows 的 服務器 所以下載windows 的nginx 下載完成以后 這個里面的html 文件 就是前端項目 里面必須要有index.html文件 部署…

行業實踐案例:醫療行業數據治理的挑戰與突破

“醫療數據不僅是資源,更關乎生命。” ——醫療行業的數據治理,是合規、安全、質量與智能化的多重挑戰。 ?? 本文目錄 為什么醫療行業亟需數據治理? 醫療行業數據治理的獨特挑戰 醫療數據治理體系設計原則 關鍵能力模塊與實踐案例 工具選型與落地建議 總結與下一步 1?? …

單細胞轉錄組學和空間轉錄組學數據的整合方法

文章目錄問題1&#xff1a;現有技術是否可以拿取固定數目的細胞進行組合形成spot問題2&#xff1a;是否有關于這方面的研究問題3&#xff1a;相關論文推薦一、細胞反卷積的核心目標與挑戰二、單細胞與空間轉錄組數據的整合方法分類1. 概率型方法&#xff08;Probabilistic-base…

【Java EE】SpringBoot 配置文件、日志和單元測試

1. 什么是配置文件在我們的計算機上諸如 C:/Users&#xff0c;C:/Windows&#xff0c;.config&#xff0c;.xml 都是配置文件&#xff0c;配置文件主要為了解決硬編碼帶來的問題。硬編碼是將數據直接寫在程序的源代碼中&#xff0c;代碼寫死后再想改變就很麻煩。因此&#xff0…

CMake實踐:常見的調試技巧

目錄 1.簡介 2.用 message() 輸出關鍵信息 2.1.message簡介 2.2.常用模式及作用 2.3.核心用法示例 2.4.常見問題及解決 3.查看緩存變量&#xff1a;cmake -L 與緩存文件 3.1.列出所有緩存變量&#xff08;cmake -L&#xff09; 3.2.直接查看 / 刪除 CMakeCache.txt 4…

爬蟲-第一個爬蟲程序

瀏覽器里面都是html數據&#xff0c;拿到的都是頁面源代碼&#xff0c;可以用自己的方式打開測試。打開瀏覽器decode找charset

從SEO到GEO:優化策略如何應對傳統搜索與AI搜索的巨變

AI 搜索與傳統搜索結果優化之間有什么重疊之處&#xff1f; 為了幫助確定主要的差異&#xff0c;以及那些重疊程度最高的區域&#xff0c;我創建了一個比較&#xff08;我會保持更新&#xff09;&#xff0c;通過搜索行為、優化領域、結果展示和交付&#xff0c;以及要跟蹤的 K…

mysql5.7系列-InnoDB的MVCC實現原理

談到數據庫事務都要提一下ACID 特性&#xff1a; 原子性&#xff08;Atomicity&#xff09;&#xff1a;事務中的操作要么全部執行&#xff0c;要么全部不執行。 一致性&#xff08;Consistency&#xff09;&#xff1a;事務執行前后&#xff0c;數據庫的狀態必須是一致的。 …

力扣-287.尋找重復數

題目鏈接 287.尋找重復數 class Solution {public int findDuplicate(int[] nums) {int low nums[0];int fast nums[nums[0]];//1.快慢指針找相遇點while (low ! fast) {low nums[low];fast nums[nums[fast]];}//2.雙指針找入環點int pre 0;while (pre ! low) {pre num…

Java 大視界 -- Java 大數據在智能教育個性化學習計劃制定與動態調整中的應用(338)

Java 大視界 -- Java 大數據在智能教育個性化學習計劃制定與動態調整中的應用&#xff08;338&#xff09; 引言&#xff1a;正文&#xff1a;一、Java 構建的學習行為數據采集與分析體系1.1 全場景數據接入引擎1.2 家校協同數據交互模塊1.3 學習特征提取與建模 二、Java 驅動的…

uniapp返回webview返回小程序并且跳轉回webview

webview頁面提示&#xff1a;wx一定要導入sdk// 返回小程序&#xff0c;并攜帶當前 WebView 的 URL 和狀態wx.miniProgram.postMessage({type: requestPayment,data: {webviewUrl: window.location.href,orderNum: this.orderNum,type: requestPayment}})setTimeout(() > {w…