HarmonyOS NEXT - 電商App實例三( 網絡請求axios)

????????使用axios開發網絡請求是一個非常常見的任務,尤其是Web前端開發者,對它非常熟悉。axios是一個基于Promise的HTTP客戶端,支持瀏覽器和Node.js環境,使用簡單且功能強大。

? ? ? ? 在harmonyOS中,如果想使用axios,可以通過ohpn工具包下載安裝。

? ? ? ? 接下來,將通過axios庫,對其進行二次封裝,并向后臺發送請求,完成banner數據的獲取。

一、基本使用

1.1 下載 ohpm工具包

? ? ? ? HarmonyOS開發工具DevEco Studio,最新版本DevEco Studio 5.0.1 Release安裝時,ohpm工具已包含。如果是版本較低,需要手動進行安裝,可以查看之前寫的一篇關于這方面內容,地址:HarmonyOS開發 - ohpm環境變量配置-CSDN博客。

1.2 下載axios

? ? ? ? 命令如下:

ohpm install @ohos/axios

? ? ? ? 安裝成功后,oh_modules目錄則可以看到@ohos/axios。如下圖:

1.3 導入模塊

import axios from '@ohos/axios'

1.4 發送GET請求

????????首先,我們先看下@ohos/axios的基本用法,使用axios模塊發送一個GET請求,處理響應。示例代碼如下:

// 導入模塊
import axios from '@ohos/axios'// 發送 GET 請求
axios.get('https://api.example.com/data').then(response => {console.log('Response Data:', response.data);}).catch(error => {console.error('Error:', error.message);});

1.5 配置項

? ? ? ? axios允許通過配置對象來自定義請求,一些常見的配置選項如下:

{method: 'get', // 請求方法 (get, post, put, delete 等)url: 'https://api.example.com/data', // 請求 URLheaders: {'Authorization': 'Bearer your_access_token', // 自定義請求頭'Content-Type': 'application/json'},params: {key: 'value' // URL 參數 (用于 GET 請求)},data: {key1: 'value1',key2: 'value2'}, // 請求體 (用于 POST/PUT 請求)timeout: 5000 // 請求超時時間 (毫秒)
}

1.6 處理響應

? ? ? ? 參數說明如下:

名稱

類型

描述

status

number

http響應狀態碼

statusTextstringhttp狀態信息

headers

Object

響應頭

data

any

服務端返回的響應體

configObject請求的配置信息

1.7 錯誤處理

????????參數說明如下:

名稱

類型

描述

message

string

錯誤信息

responseObject服務器的響應

request

Object

請求對象

configObject請求的配置信息

二、axios庫

? ? ? ? axios是一個非常強大且易于使用的Http客戶端,適用于大多數網絡請求。通過掌握axios,可以輕松使用它開發網絡請求,并處理各種復雜的需求。

2.1 @ohos/axios實例

? ? ? ? 如果需要為不同的API設置不的配置,可以創建一個axios實例,代碼如下:

import axios from '@ohos/axios'const axiosInstance = axios.create({baseURL: "http://test.shop.com",headers: {'Content-Type': 'application/json'}
})

2.2 攔截器

? ? ? ? axios提供了請求和響應攔截器,可以在請求發送前或響應到達后對其進行處理。

2.2.1 請求攔截器

? ? ? ? 在項目中,一些API請求需要訪問令牌(即證明登錄的一串字符串),為了方便,可以在攔截器中統一添加。示例代碼如下:

// 請求攔截器
axiosInstance.interceptors.request.use(config => {// 在請求發送前做一些處理config.headers['accessToken'] = 'kl1ad1234214dfasdfas'  // 添加訪問令牌return config;
}, error => {return Promise.reject(error);
});

2.2.2 響應攔截器

? ? ? ? 在電商項目中,例如下單功能,必須為登錄狀態;此時,如果用戶在未登錄狀態下點擊購買,須跳轉到登錄界面或給用戶相關提示信息;

????????除了下單功能,我的界面,訂單列表、詳單詳情、我的收藏等,都是需要用戶在登錄狀態下進行操作;所以,此時我們可以在響應攔截器中,做統一處理,當接收到登錄失效或未登錄的狀態碼時,作出相應操作。攔截器代碼如下:

// 響應攔截器
axiosInstance.interceptors.response.use(response => {// 在響應到達后做一些處理if (response.status == 400) {// 如果400表示登錄失效,訪問頁面必須為登錄狀態,此時程序須做跳轉到登錄界面,或提示操作}return response;
}, error => {return Promise.reject(error);
});

2.3?any 和 unknown問題

? ? ? ? ?在ArkTS中,使用 @ohos/axios 發起網絡請求時,如果遇到 arkts-no-any-unknown 錯誤(Use explicit types instead of "any", "unknown" (arkts-no-any-unknown) <ArkTSCheck>。),說明代碼中使用了 any 或 unknown 類型,而 ArkTS 要求使用顯式類型以提高代碼的類型安全性。

? ? ? ? 這個問題,在上篇@ohos.net.http請求封裝中也存在,并將其解決。如需了解的朋友,可以前去查看,地址:HarmonyOS開發 - 電商App實例二( 網絡請求http)-CSDN博客。

2.4 定義接口? ? ? ??

????????所以在封裝axios請求前,為避免使用 any 和 unknown,并確保類型安全。將請求和響應的數據定義為明確的接口。示例代碼如下:

import { Method } from '@ohos/axios'// http定義請求參數接口
interface axiosRequestOptions {url: string;method?: Method,headers?: Record<string, string>;data?: Record<string, any>;params?: Record<string, any>;timeout?: number
}// http定義響應數據接口
interface axiosHttpResponse<T> {responseCode: number;result: T;
}

2.5 @ohos/axios封裝

????????為了簡化代碼并提高復用性,可以將@ohos/axios封裝成一個工具類。先在ets目錄下創建utils目錄,再創建axiosUtil類(路徑:ets/utils/axiosUtil.ts)。使用顯式類型替代 any 和 unknown,代碼如下:

import axios, { AxiosInstance, Method } from '@ohos/axios'
import { axiosRequestOptions } from '../types/http';export class axiosUtil {private base_url: string = '';  // 基礎路徑private headers: Record<string, string> | null = null; // header信息private axiosRequest: AxiosInstance; // request請求constructor(base_url?: string, headers?: Record<string, string>) {this.base_url = base_urlthis.headers = headers// axios實例this.axiosRequest = axios.create({baseURL: this.base_url,headers: this.headers})}/*** 發送 http 請求* @param options 請求配置* @returns 返回響應數據*/public async request<T> (options: axiosRequestOptions): Promise<T> {const { url, method = 'GET', headers = {}, params, data } = options;try {const response = await this.axiosRequest({url,method,headers,params,data});if (response.status === 200) {return response.data as T; // 顯式類型斷言} else {throw new Error(`HTTP Error: ${response.status}`);}} catch (error) {throw new Error(`Request Failed: ${error.message}`);}}/*** 發送 GET 請求* @param url 請求地址* @param params URL 參數* @param headers 請求頭* @returns 返回響應數據*/public async get<T>(url: string, params?: Record<string, any>, headers: Record<string, string> = {}): Promise<T> {return this.request<T>({ url, method: 'GET', headers, params });}/*** 發送 POST 請求* @param url 請求地址* @param data 請求體* @param headers 請求頭* @returns 返回響應數據*/public async post<T>(url: string, data: Record<string, any>, headers: Record<string, string> = {}): Promise<T> {return this.request<T>({ url, method: 'POST', headers, data });}
}

2.6 實例axiosUtil類

????????在utils目錄中,再創建request請求文件(路徑:ets/utils/request.ts),用于初始化http請求的基礎路徑和header請求類型信息。示例代碼如下

import { axiosUtil } from './axiosUtil'
/*** 初始化請求 實例類*/
export const axiosRequest = new axiosUtil('http://test.shop.com', {'Content-Type': 'application/json'
})

2.7 api請求

????????在api目錄創建,創建index.ts文件,用于定義具體業務請求函數。這里向后臺發送一個GET請求,用于獲取banner信息。示例代碼如下:

import { axiosRequest } from '../utils/request'
interface apiBanner {id: number;name: string;thumb: string;uid: number;createTime: Date;updateTime: Date;
}/*** 獲取banner信息*/
export const getBannerInfo = async () => {return await axiosRequest.get<apiBanner>('/banner.php')
}

2.8 獲取Banner信息

? ????????如下圖,在頁面中添加按鈕,點擊“獲取banner信息”,向后臺發送GET請求,獲取banner數據。

? ? ? ? 打開pages/index.ets 頁面文件,添加http請求。代碼如下:

import { getBannerInfo } from '../api/index'@Entry
@Component
struct Index {@State bannerMessage: string = '';build() {RelativeContainer() {Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center }){Text(this.bannerMessage)Button('獲取banner信息').onClick(async () => {console.log('tag')await getBannerInfo().then(res => {this.bannerMessage = JSON.stringify(res)console.log('tas success', res)}).catch(() => {console.error('Error')})})}.width('100%')}.height('100%').width('100%')}
}

? ? ? ?

?????????此時,在頁面中點擊按鈕,獲取banner信息。如下圖:

三、http和axios比較

????????HarmonyOS中,@ohos.net.http和@ohos/axios都是用于進行網絡請求的工具,它們各自具有不同的特點和適用場景。

3.1 基礎概述

3.1.1 @ohos.net.http

  • HarmonyOS中用于進行HTTP網絡請求的原生接口或組件。
  • 支持GET、POST、PUT、DELETE等常見的HTTP請求方法。
  • 通常用于簡單的數據傳輸和RESTful API的交互。
    ?

3.1.2 @ohos/axios

  • Axios在HarmonyOS平臺的適配版本。
  • 基于Promise的HTTP客戶端,適用于瀏覽器和Node.js環境,同時也兼容HarmonyOS。
  • 保留了Axios的主要特性,并適配了HarmonyOS的網絡API。

3.2?泛型支持

3.2.1?@ohos.net.http

  • 不直接支持泛型類型。
  • 返回的響應數據默認為string或ArrayBuffer,需要開發者手動解析和類型斷言。

3.2.2?@ohos/axios

  • 通過泛型參數直接定義響應數據類型,實現編譯時類型安全。
  • 提供了更好的開發體驗和代碼可讀性。

3.3?參數傳遞與序列化

3.3.1?@ohos.net.http

  • 請求配置通過options對象傳遞,類型為HttpRequestOptions,無泛型支持。
  • 請求體使用extraData字段,類型為string或ArrayBuffer,需要手動序列化。

3.3.2?@ohos/axios

  • 請求體可以直接傳遞對象,Axios會根據Content-Type自動序列化為JSON。
  • 泛型配置支持通過泛型定義請求參數和響應數據類型。

???????在HarmonyOS中選擇使用@ohos.net.http還是@ohos/axios主要取決于具體的應用場景、開發者的偏好以及對庫或API的熟悉程度。

????????如果你有更多問題,歡迎隨時溝通交流!

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

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

相關文章

生成省市區JSON

省市區 學習記錄 https://xiangyuecn.github.io/AreaCity-JsSpider-StatsGov/ package cn.serverx.sx.your;import cn.hutool.core.io.FileUtil; import cn.serverx.sx.your.vo.DistrictNode; import com.alibaba.fastjson2.JSON; import com.google.common.collect.Lists; i…

醫療APP開發如何實現跨機構數據互通

醫療APP開發如何實現跨機構數據互通 在數字化醫療時代,醫療APP開發已成為連接醫療機構、患者和醫療資源的重要橋梁。然而,如何實現跨機構的數據互通,成為醫療APP開發中的一大挑戰。本文將探討如何通過醫療APP開發實現跨機構數據互通,提升醫療服務效率和患者體驗。我們將涵…

自定義Linux網絡協議的開發與測試

在當今快速發展的技術領域中,定制化網絡協議可以為特定的應用場景提供靈活而強大的解決方案。本文將詳細介紹如何在Linux系統上開發一個自定義網絡協議,并編寫相應的用戶空間程序進行測試。所有步驟基于2025年3月11日的時間點完成。 開發自定義協議內核模塊 定義協議和實現…

PySide(PyQT)的mouseMoveEvent()和hoverMoveEvent()的區別

在 PySide中&#xff0c;mouseMoveEvent 和 hoverMoveEvent 都是用于處理鼠標移動相關操作的事件&#xff0c;但它們之間存在明顯的區別&#xff1a; 事件觸發條件 ? mouseMoveEvent&#xff1a; 當鼠標在對應的圖形項&#xff08;如 QGraphicsPixmapItem&#xff09…

級聯樹SELECTTREE格式調整

步驟&#xff1a; 1、將全部列表設置成Map<Long, List<Obejct>> map的格式&#xff0c;方便查看每個父級對應的子列表&#xff0c;減少循環次數 2、對這個map進行遞歸&#xff0c;重新進行級聯樹的集合調整&#xff0c;將子集放置在對應的childs里面。 public Dyna…

詳解數據庫范式

范式 1. 第一范式&#xff08;1NF&#xff09;2. 第二范式&#xff08;2NF&#xff09;3. 第三范式&#xff08;3NF&#xff09;4. BC范式&#xff08;BCNF&#xff0c;Boyce-Codd Normal Form&#xff09;5. 第四范式&#xff08;4NF&#xff09;6. 第五范式&#xff08;5NF&a…

一窺DeepSeek開源EPLB項目:揭開技術背后的面紗

摘要 在DeepSeek開源DualPipe項目的同一天&#xff0c;EPLB項目也正式對外公開。EPLB&#xff08;Enhanced Pipeline Balancing&#xff09;并非一蹴而就的奇跡&#xff0c;而是經過長時間的研發與優化。該項目旨在通過改進管道平衡機制&#xff0c;提升系統的穩定性和效率。本…

Unity進階課程【二】Mask 組件的使用 UI遮罩效果以及透明摳圖效果

Unity組件講解 Mask 時隔多年&#xff0c;今天咱們繼續進階課程&#xff0c;這幾年變化很大&#xff0c;但是一直還是從事Unity行業&#xff0c;行業雖難&#xff0c;依舊堅持&#xff0c;以后會養成習慣&#xff0c;定期更新&#xff0c;希望小伙伴們監督&#xff0c;有想學習…

汽車無鑰匙啟動系統不使用傳統機械鑰匙啟動汽車

汽車無鑰匙啟動系統 定義 汽車無鑰匙啟動系統&#xff08;Keyless Start System&#xff09;&#xff0c;啟動車輛時不用掏擰鑰匙&#xff0c;只需把鑰匙放在包內或口袋里&#xff0c;按下車內按鍵或擰動導板即可使發動機點火。它無需插入鑰匙&#xff0c;通過點按按鍵或旋轉…

Webpack 和 Vite 的主要區別

Webpack 和 Vite 的主要區別&#xff0c;從構建機制、開發體驗、生產優化等多個維度進行對比&#xff1a; 1. 構建機制與速度 Webpack 全量打包&#xff1a;啟動時必須分析所有模塊依賴關系&#xff0c;進行全量打包&#xff0c;生成 Bundle 文件。項目越大&#xff0c;冷啟動時…

【Python】Python 3.11安裝教程

一、Python 3.11安裝包下載 1. Python 3.11下載與安裝 Download Python | Python.org 下載完成包含以下文件&#xff1a; 二、python3.11安裝步驟 1.右鍵以管理員身份運行安裝程序。 2.勾選【Add Python…】然后點擊【Customize…】。 3.頁面點擊【Next】。 4.勾選【Install …

如何處理PHP中的編碼問題

如何處理PHP中的編碼問題 在PHP開發過程中&#xff0c;編碼問題是一個常見且棘手的問題。無論是處理用戶輸入、數據庫交互&#xff0c;還是與外部API通信&#xff0c;編碼問題都可能導致數據亂碼、解析錯誤甚至安全漏洞。本文將深入探討PHP中的編碼問題&#xff0c;并提供一些…

【畢業論文格式】word分頁符后的標題段前間距消失

文章目錄 【問題描述】 分頁符之后的段落開頭&#xff0c;明明設置了標題有段前段后間距&#xff0c;但是沒有顯示間距&#xff1a; 【解決辦法】 選中標題&#xff0c;選擇邊框 3. 選擇段前間距&#xff0c;1~31磅的一個數 結果

【實戰ES】實戰 Elasticsearch:快速上手與深度實踐-附錄-3-從ES 7.x到8.x的平滑遷移策略

&#x1f449; 點擊關注不迷路 &#x1f449; 點擊關注不迷路 &#x1f449; 點擊關注不迷路 附錄-版本升級指南 3-Elasticsearch 7.x 到 8.x 平滑遷移策略指南1. 升級必要性分析1.1 版本特性對比1.2 兼容性評估矩陣 2. 預升級準備清單2.1 環境檢查表2.2 數據備份策略 3. 分階段…

Android,Java,Kotlin 確保線程順序執行的多種實現方式

在多線程編程中&#xff0c;有時需要確保一個線程必須等待另一個線程執行完畢后再執行。本文將介紹幾種常見的方法來實現這一需求&#xff0c;并提供詳細的代碼示例。 1. 使用 Thread.join() Thread.join() 是最簡單直接的方法&#xff0c;它會讓當前線程等待目標線程執行完畢…

論文調研 | 一些開源的AI代碼生成模型調研及總結【更新于250313】

本文主要介紹主流代碼生成模型&#xff0c;總結了基于代碼生成的大語言模型&#xff0c;按照時間順序排列。 在了解代碼大語言模型之前&#xff0c;需要了解代碼相關子任務 代碼生成 文本生成代碼(Text to code):根據自然語言描述生成代碼 重構代碼&#xff08;Refactoring …

【QT】-一文說清楚QT定時器怎么用

在 Qt 中&#xff0c;定時器&#xff08;QTimer&#xff09;是用來定時執行某些任務的非常有用的類。它可以幫助你在指定的時間間隔后重復執行某個函數。常見的用法是啟動一個定時器&#xff0c;每過一段時間自動執行某個操作&#xff0c;比如更新 UI、檢查狀態或發送數據等。 …

iOS OC匹配多個文字修改顏色和字號

1、傳入字符串數組&#xff0c;通過NSMutableAttributedString修改匹配文字 可以根據需要搞成匹配單個字符串 - (NSAttributedString *)applyFontSizeToText:(NSString *)text matchStrings:(NSArray<NSString *> *)matchStrings {NSMutableAttributedString *attribut…

3DS模擬器使用(pc+安卓)+金手指+存檔互傳

1、引言 3ds模擬器已經能夠在手機端近乎完美模擬了&#xff0c;那么多的3ds游戲&#xff0c;比玩手機游戲舒服多了。 本人是精靈寶可夢的老玩家&#xff0c;從第一世代就一直在玩&#xff0c;剛耍完NDS的第五世代&#xff0c;黑白系列。現在到寶可夢XY了&#xff0c;需要在3d…

Java EE Web環境安裝

Java EE Web環境安裝 一、JDK安裝與測試&#xff08;Windows環境&#xff09; 1. 安裝JDK 官網下載&#xff1a;Oracle JDK&#xff08;選擇Windows x64 Installer&#xff09;雙擊安裝包&#xff0c;按向導完成安裝 ? 2. 環境變量配置 右鍵【此電腦】→【屬性】→【高級…