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.rhkb.cn/news/33594.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

19、TCP连接四次挥手的过程,为什么是四次?【高频】

四次挥手的过程 假设客户端主动发起。 第一次挥手&#xff1a;客户端向服务器 发送 FIN&#xff0c;表示 自己要断开数连接。随后&#xff0c;客户端 进入 FIN-WAIT-1 状态&#xff1b;服务器收到后&#xff0c;变为CLOSE_WAIT状态 第二次挥手&#xff1a;服务器 发送ACK 作为…

蓝桥云客 挖矿

0挖矿 - 蓝桥云课 问题描述 小蓝正在数轴上挖矿&#xff0c;数轴上一共有 n 个矿洞&#xff0c;第 i 个矿洞的坐标为 ai​。小蓝从 0 出发&#xff0c;每次可以向左或向右移动 1 的距离&#xff0c;当路过一个矿洞时&#xff0c;就会进行挖矿作业&#xff0c;获得 1 单位矿石&…

ssm:商业异常处理流程

第一步 定义全局R类制定标准 代码定义了一个通用的返回类 R<T>&#xff0c;用于封装API请求的结果&#xff0c;包括状态码、消息和数据。该类使用了Lombok的Data注解来减少样板代码&#xff08;如getter、setter方法等&#xff09;的编写。以下是代码的一些解释和建议&am…

Inficon IC5 沉积控制器 IC/5 型号

Inficon IC5 沉积控制器 IC/5 型号

农业建设项目管理系统评测:8款推荐工具优缺点分析

本文主要介绍了以下8款农业建设项目管理系统&#xff1a;1.PingCode&#xff1b; 2. Worktile &#xff1b;3. 建米农业工程项目管理系统&#xff1b;4. 开创云数字农业管理平台&#xff1b; 5. Trimble Ag Software&#xff1b;6.Conservis&#xff1b; 7. Agworld &#xff1…

大视频背景暗黑风格的wordpress企业主题免费下载

整体风格是黑色的&#xff0c;首页首屏大视频背景&#xff0c;动态效果非常好。向下滚动时&#xff0c;滚动的特效也不错。 原文 https://www.bixugao.com/wp/26.html

西门子S7-1200 PLC远程调试技术方案(巨控GRM532模块)

三步快速实现远程调试 硬件部署 准备西门子S7-1200 PLC、巨控GRM552YW-C模块及编程电脑。GRM552YW-C通过网口与PLC连接&#xff0c;支持4G/5G/Wi-Fi/有线网络接入&#xff0c;无需复杂布线。 软件配置 安装GVCOM3配置软件&#xff0c;注册模块&#xff08;输入唯一序列号与密…

系统思考:客户价值

“真正的市场竞争&#xff0c;不是比谁更能制造产品&#xff0c;而是比谁更能创造价值。” ——杰夫贝索斯 在组织辅导中&#xff0c;我经常问团队一个问题&#xff1a;“我们的客户是谁&#xff1f;”大多数人的第一反应是——“支付费用的就是客户。” 这在过去的市场扩张阶…

Centos7网卡 Failed to start LSB: Bring up/down networking

Centos7网卡 Failed to start LSB: Bring up/down networking 检查虚拟网络编辑器配置无误编辑ifcfg-ens33文件 Centos7重启网卡服务失败错误如下 给Centos7系统使用NAT模式配置静态IP地址&#xff1a; 检查虚拟网络编辑器配置无误 编辑ifcfg-ens33文件 vim /etc/sysconfig/ne…

第一个vue项目

项目目录 启动vue项目 npm run serve 1.vue.config.js文件 (CLI通过vue-cli-serve启动项目&#xff0c;解析配置配置文件vue-condig-js&#xff09; // vue.config.js //引入path板块&#xff0c;这是Node.js的一个内置模块&#xff0c;用于处理文件路径&#xff0c;这里引用…

【Qt】QWidget属性介绍

&#x1f3e0;个人主页&#xff1a;Yui_ &#x1f351;操作环境&#xff1a;Qt Creator &#x1f680;所属专栏&#xff1a;Qt 文章目录 前言1. enabled属性2.geometry属性2.1 改变控件位置2.2 女神表白程序2.3 知识补充——window frame 3. windowsTitle属性4. windowIcon属性…

嵌入式八股ARM篇

前言 ARM篇主要介绍一下寄存器和中断机制,至于汇编这一块…还请大家感兴趣自行学习 1.寄存器 R0 - R3 R4 - R11 寄存器 R0 - R3一般用作函数传参 R4 - R11用来保存程序运算的中间结果或函数的局部变量 在函数调用过程中 注意在发生异常的时候 cortex-M0架构会自动将R0-R3压入…

nerfstudio以及相关使用记录(长期更新)

NeRFStudio 是NeRF/3DGS研究和开发的集成平台。 提供了一个用户友好的界面和一系列工具&#xff0c;帮助研究人员和开发者更高效地构建、训练和评估 NeRF 模型。以前使用的时候用完就丢一边了&#xff0c;没有注意记录&#xff0c;现在有一个工程调用了nerfstudio&#xff0c;部…

《论分布式系统架构设计及其应用》架构师论文

【摘要】 2022年3月&#xff0c;我参与了某金融科技公司“智能风控云平台”项目的研发工作&#xff0c;担任系统架构师职务&#xff0c;负责分布式系统架构设计与核心技术选型。该平台旨在为银行、保险等金融机构提供实时风险评估、反欺诈及数据服务&#xff0c;需支撑每秒十万…

黄金还能再涨吗?

写在前面&#xff1a;【财富自由计算助手】已上线&#xff0c;快算算你的财富自由要多少 逻辑比事实更真实。 最近&#xff0c;黄金涨得妈都不认。 连菜市场大妈都在讨论&#xff0c;要不要囤点黄金。 2022 年初&#xff0c;俄乌冲突升级为全面战争以来&#xff0c;黄金价格…

AutoDev × MCP 双向赋能:AutoDev 即 MCP 服务,MCP 服务即 AutoDev 指令

在 Agentic Coding 这一话题下&#xff0c;工具使用&#xff08;Tool Use/Function calling&#xff09;是一个非常有意思的话题。完成一个软件开发任务&#xff0c;需要使用到大量的工具&#xff0c; 除去在 IDE 及其插件生态本身提供的功能外&#xff0c;还会使用到大量的外部…

DataWhale 大语言模型 - GPT和DeepSeek模型介绍

本课程围绕中国人民大学高瓴人工智能学院赵鑫教授团队出品的《大语言模型》书籍展开&#xff0c;覆盖大语言模型训练与使用的全流程&#xff0c;从预训练到微调与对齐&#xff0c;从使用技术到评测应用&#xff0c;帮助学员全面掌握大语言模型的核心技术。并且&#xff0c;课程…

安装 oepn-webui报错 Cannot connect to host api.openai.com:443 ssl

一、发现问题 安装 open-webui 的报错 api.openai.com 不通&#xff0c;因为 open-webui 最新版和以前的不一样了&#xff0c;所以网上的很多资料都用不了&#xff0c;经过一番摸索&#xff0c;找到解决办法 另外如果发现浏览器打开之后白屏&#xff0c;则是因为后台正在配置…

【6】树状数组学习笔记

前言 树状数组是我学的第一个高级数据结构&#xff0c;属于 log ⁡ \log log 级数据结构。 其实现在一般不会单独考察数据结构&#xff0c;主要是其在其他算法&#xff08;如贪心&#xff0c;DP&#xff09;中起到优化作用。 长文警告&#xff1a;本文一共 995 995 995 行…

研发团队协作软件推荐:18款工具对比

本文将深入对比18款主流研发团队协作软件&#xff1a;PingCode、 Worktile、钉钉、飞书、企业微信、Teambition、蓝湖、石墨文档、明道等。 在当今信息化时代&#xff0c;研发团队协作软件已经成为企业提高工作效率、改善团队沟通与管理的重要工具。借助这些软件&#xff0c;企…