【HarmonyOS开发】ArkTs使用Http封装

图片

1、鸿蒙中如何进行网络请求

1.1 三方库请求

  • @ohos/axios

  • @ohos/retrofit

  • @ohos/httpclient

1.2 鸿蒙原生请求

  • @ohos.net.http

2、ArkTs请求模块@ohos.net.http

本模块提供HTTP数据请求能力。应用可以通过HTTP发起一个数据请求,支持常见的GET、POST、OPTIONS、HEAD、PUT、DELETE、TRACE、CONNECT方法。

3、@ohos.net.http请求流程

  1. http.createHttp(创建请求实例任务);

  2. request(请求);

  3. destroy(中断请求);

  4. on(订阅HTTP Response Header 事件);

  5. off(取消订阅HTTP Response Header 事件);

  6. once(订阅HTTP Response Header 事件,但是只触发一次);

4、预览效果

图片

图片

5、封装@ohos.net.http

5.1 函数式

5.1.1 封装


import http from '@ohos.net.http';export interface httpOptions {timeOut?: number;ContentType?: string;header?: Object;state?: string;callBack?: Function;
}const HTTP_READ_TIMEOUT = 60000;
const HTTP_CONNECT_TIMEOUT = 60000;
const CONTENT_TYPE = 'application/json'export function httpRequest(url: string,method: http.RequestMethod = http.RequestMethod.GET,params?: string | Object | ArrayBuffer,options?: httpOptions
): Promise<ResponseResult> {const request = http.createHttp();// 处理状态if(options?.state) {switch (options.state) {case 'on':request.on('headersReceive', (header) => options.callBack(header));break;case 'once':request.on('headersReceive', (header) => options.callBack(header));break;case 'off':request.off('headersReceive');break;case 'destroy':request.destroy();break;default:break;}return;}// 处理请求const responseResult = request.request(url, {// 超时时间readTimeout: options?.timeOut || HTTP_READ_TIMEOUT,connectTimeout: options?.timeOut || HTTP_CONNECT_TIMEOUT,method,extraData: params || {},header: options?.header || {'Content-Type': options?.ContentType || CONTENT_TYPE},});let serverData: ResponseResult = new ResponseResult();// Processes the data and returns.return responseResult.then((data: http.HttpResponse) => {if (data.responseCode === http.ResponseCode.OK) {// Obtains the returned data.let result = `${data.result}`;let resultJson: ResponseResult = JSON.parse(result);serverData.data = resultJson;serverData.code = 'success';serverData.msg = resultJson?.msg;} else {serverData.msg = `error info & ${data.responseCode}`;}return serverData;}).catch((err) => {serverData.msg = `${err}`;return serverData;})
}export class ResponseResult {/*** Code returned by the network request: success, fail.*/code: string;/*** Message returned by the network request.*/msg: string | Resource;/*** Data returned by the network request.*/data: string | Object | ArrayBuffer;constructor() {this.code = '';this.msg = '';this.data = '';}
}export default httpRequest;

5.1.2 使用


import httpRequest from '../../utils/requestHttp';interface resultType {resultcode: string;reason: string;result: resultValType | null;error_code: string;
}interface resultValType {city: string;realtime: realtimeType;future: Object;
}interface realtimeType {temperature: string;humidity: string;info: string;wid: string;direct: string;power: string;aqi: string;
}@Extend(Text) function textStyle() {.fontColor(Color.White).margin({left: 12})
}@Entry
@Component
struct httpPages {@State html: resultValType = {city: '',realtime: {temperature: '',humidity: '',info: '',wid: '',direct: '',power: '',aqi: '',},future: undefined};@State url: string = "http://apis.juhe.cn/simpleWeather/query?key=397c9db4cb0621ad0313123dab416668&city=西安";@Styles weatherStyle() {.width('100%').padding(6).backgroundColor(Color.Green).borderRadius(8)}build() {Column({space: 10}) {Button("请求数据").onClick(() => {this.httpRequest();})Column() {Text(this.html.city || '--').textStyle().fontWeight(FontWeight.Bold)}.weatherStyle().alignItems(HorizontalAlign.Start)Column() {Text(this.html.realtime.temperature || '--').textStyle()}.weatherStyle().alignItems(HorizontalAlign.Start)Column() {Text(this.html.realtime.humidity || '--').textStyle()}.weatherStyle().alignItems(HorizontalAlign.Start)Column() {Text(this.html.realtime.info || '--').textStyle()}.weatherStyle().alignItems(HorizontalAlign.Start)Column() {Text(this.html.realtime.wid || '--').textStyle()}.weatherStyle().alignItems(HorizontalAlign.Start)Column() {Text(this.html.realtime.direct || '--').textStyle()}.weatherStyle().alignItems(HorizontalAlign.Start)Column() {Text(this.html.realtime.power || '--').textStyle()}.weatherStyle().alignItems(HorizontalAlign.Start)Column() {Text(this.html.realtime.aqi || '--').textStyle()}.weatherStyle().alignItems(HorizontalAlign.Start)}.width('100%').height('100%').padding(10)}private httpRequest() {httpRequest(this.url).then(res => {const data: resultType = res.data as resultType;this.html = data.result;console.info('网络结果:'+JSON.stringify(data));});}
}

5.2 泛型式

5.2.1 封装

import http from '@ohos.net.http';// 1、创建RequestOption.ets 配置类
export interface RequestOptions {url?: string;method?: RequestMethod; // default is GETqueryParams ?: Record<string, string>;extraData?: string | Object | ArrayBuffer;header?: Object; // default is 'content-type': 'application/json'
}export enum RequestMethod {OPTIONS = "OPTIONS",GET = "GET",HEAD = "HEAD",POST = "POST",PUT = "PUT",DELETE = "DELETE",TRACE = "TRACE",CONNECT = "CONNECT"
}/*** Http请求器*/
export class HttpCore {/*** 发送请求* @param requestOption* @returns Promise*/request<T>(requestOption: RequestOptions): Promise<T> {return new Promise<T>((resolve, reject) => {this.sendRequest(requestOption).then((response) => {if (typeof response.result !== 'string') {reject(new Error('Invalid data type'));} else {let bean: T = JSON.parse(response.result);if (bean) {resolve(bean);} else {reject(new Error('Invalid data type,JSON to T failed'));}}}).catch((error) => {reject(error);});});}private sendRequest(requestOption: RequestOptions): Promise<http.HttpResponse> {// 每一个httpRequest对应一个HTTP请求任务,不可复用let httpRequest = http.createHttp();let resolveFunction, rejectFunction;const resultPromise = new Promise<http.HttpResponse>((resolve, reject) => {resolveFunction = resolve;rejectFunction = reject;});if (!this.isValidUrl(requestOption.url)) {return Promise.reject(new Error('url格式不合法.'));}let promise = httpRequest.request(this.appendQueryParams(requestOption.url, requestOption.queryParams), {method: requestOption.method,header: requestOption.header,extraData: requestOption.extraData, // 当使用POST请求时此字段用于传递内容expectDataType: http.HttpDataType.STRING // 可选,指定返回数据的类型});promise.then((response) => {console.info('Result:' + response.result);console.info('code:' + response.responseCode);console.info('header:' + JSON.stringify(response.header));if (http.ResponseCode.OK !== response.responseCode) {throw new Error('http responseCode !=200');}resolveFunction(response);}).catch((err) => {rejectFunction(err);}).finally(() => {// 当该请求使用完毕时,调用destroy方法主动销毁。httpRequest.destroy();})return resultPromise;}private appendQueryParams(url: string, queryParams: Record<string, string>): string {// todo 使用将参数拼接到url上return url;}private isValidUrl(url: string): boolean {//todo 实现URL格式判断return true;}
}// 实例化请求器
const httpCore = new HttpCore();export class HttpManager {private static mInstance: HttpManager;// 防止实例化private constructor() {}static getInstance(): HttpManager {if (!HttpManager.mInstance) {HttpManager.mInstance = new HttpManager();}return HttpManager.mInstance;}request<T>(option: RequestOptions): Promise<T> {return httpCore.request(option);}
}export default HttpManager;

5.2.2 使用

import httpManager, { RequestMethod } from '../../utils/requestManager';interface TestBean {userId: number,id: number,title: string,completed: boolean
}private handleClick() {httpManager.getInstance().request<TestBean>({method: RequestMethod.GET,url: 'https://jsonplaceholder.typicode.com/todos/1' //公开的API}).then((result) => {this.text = JSON.stringify(result);console.info(JSON.stringify(result));}).catch((err) => {console.error(JSON.stringify(err));});}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/294788.html

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

相关文章

SuperMap iServer发布的ArcGIS REST 地图服务如何通过ArcGIS API加载

作者&#xff1a;yx 文章目录 一、发布服务二、代码加载三、结果展示 一、发布服务 SuperMap iServer支持将地图发布为ArcGIS REST地图服务&#xff0c;您可以在发布服务时直接勾选ArcGIS REST地图服务&#xff0c;如下图所示&#xff1a; 也可以在已发布的地图服务中&#x…

腾讯云服务器root登录(轻量应用服务器)

Ubuntu 系统如何使用 root 用户登录实例&#xff1f; Ubuntu 系统的默认用户名是 ubuntu&#xff0c;并在安装过程中默认不设置 root 账户和密码。您如有需要&#xff0c;可在设置中开启允许 root 用户登录。具体操作步骤如下&#xff1a; 1. 使用 ubuntu 账户登录轻量应用服…

Midjourney v6 正式发布,AI创新工坊同步更新

Midjourney v6 开发团队将从2023 年 12 月 21 日今晚开始&#xff0c;在寒假期间让社区测试Midjourney v6模型的 alpha 版本。 要打开它&#xff0c;V6请从提示下方的下拉菜单中选择/settings或--v 6在提示后键入。 Midjourney v6 基本型号有哪些新功能&#xff1f; 更准确的…

运维管理平台哪个好?如何挑选合适的运维管理平台?

运用运维管理平台来处理一些内部后勤事务或者对外的售后服务&#xff0c;是现在很多企业采用的管理方法&#xff0c;优势是成本较低&#xff0c;效率更高。那么&#xff0c;运维管理平台哪个比较好呢&#xff1f; 选择运维管理平台要先找准自己的需求&#xff0c;然后才能选出合…

普通Java项目打包可执行Jar

普通Java项目打包 IDEA配置 在项目配置中选择 Artifacts -> JAR -> From modules with dependencies 选择项目模块&#xff0c;程序主类、依赖引入方式、清单文件位置 确认Jar名称和Jar输出目录 通过 Build -> Build Artifact -> Build 打包Jar文件 Java打包可执…

postgresql|数据库|LVM快照热备冷恢复数据库的思考

一&#xff0c; LVM快照备份的意义 数据库备份一直是数据库运维工作中的重点&#xff0c;一个完备的备份不仅仅是仅有后悔药的功能&#xff0c;还可能有迁移数据库的作用。 那么&#xff0c;数据库备份系统我们需要的&#xff0c;也就是看重的是四个点&#xff0c;甚至更多的…

Qt WebAssembly开发环境配置

目录 前言1、下载Emscripten SDK2、 安装3、环境变量配置4、QtCreator配置5、运行示例程序总结 前言 本文主要介绍 Qt WebAssembly 开发环境的配置。Qt for Webassembly 可以使Qt应用程序在Web上运行。WebAssembly&#xff08;简称Wasm&#xff09;是一种能够在虚拟机中执行的…

<HarmonyOS第一课>运行Hello World

下载与安装DevEco Studio 在HarmonyOS应用开发学习之前&#xff0c;需要进行一些准备工作&#xff0c;首先需要完成开发工具DevEco Studio的下载与安装以及环境配置。 进入DevEco Studio下载官网&#xff0c;单击“立即下载”进入下载页面。 DevEco Studio提供了Windows版本和…

[SWPUCTF 2021 新生赛]jicao

首先打开环境 代码审计&#xff0c;他这儿需要进行GET传参和POST传参&#xff0c;需要进行POST请求 变量idwllmNB&#xff0c;进行GET请求变量json里需要含参数x以及jsonwllm 构造 得到flag

Maven简介

1 Maven介绍 1.1 官网地址 Maven 1.2 Maven是什么 Maven是一种项目管理、依赖管理、项目构建的工具&#xff0c;可以进行自动化构建、测试、打包和发布项目。 依赖管理 随着项目引入jar包的增多&#xff0c;我们需要对其进行管理&#xff0c;包括jar包之间的版本依赖管理&a…

【QT八股文】系列之篇章1 | QT的基础知识及事件/机制

【QT八股文】系列之篇章1 | QT的基础知识及事件/机制 前言0. 基础Qt/PyQt5介绍/关联Qt的优缺点&#xff08;为什么要用qt来做界面&#xff09;Qt 的核心机制请简要介绍一下Qt中的主窗口&#xff08;MainWindow&#xff09;类&#xff0c;它有哪些重要的函数和成员变量&#xff…

qt项目-《图像标注软件》源码阅读笔记-类图

目录 1. 开源项目链接 2. 项目界面 3. 项目类图 3.1 形状的绘制及形状的存储 3.2 主窗口中心组件的界面管理 3.3 Command负责实现撤销和重做功能 3.4 其他类 3.5 枚举 3.5.1 Status 主窗口的状态变量 3.5.2 Mode 主窗口模式状态变量 3.5.3 shapeStatus 中心组件状态…