HarmonyOS 鸿蒙Next HTTP.Request 数据请求封装
HarmonyOS 鸿蒙Next HTTP.Request 数据请求封装
在项目中经常我们会用到请求API返回和操作系统,为了方便后续工作需要封装统一接口。
首先申请ohos.permission.INTERNET权限。
1、定义Res 基础Model
//res的数据模型
export class dataListModel {
code: number = 0
msg: string = ''
result: object= []
constructor(code: number, msg: string, result: []) {
this.code = code;
this.msg = msg;
this.result = result;
}
}
2、封装Request 请求
import http from '@ohos.net.http';
import { BusinessError } from '@ohos.base';
import {dataListModel} from '../viewmodel/DataList'
import promptAction from '@ohos.promptAction';
import {HttpConfig} from '../config/HttpConfig'
import { AppUtil ,LogUtil, NetworkUtil, ToastUtil} from '@pura/harmony-utils';
let showToastBottom:number =300;
// get请求 isShowToast是否需要在code!=200时候弹窗
export async function httpRequestGet<T>(url:string ,isShowToast:boolean,callback: (result: T) => void){
let hasDefaultNet = NetworkUtil.hasDefaultNetSync();
if(!hasDefaultNet){
ToastUtil.showToast('当前没有网络,请检查网络连接!')
return;
}
// 每一个httpRequest对应一个HTTP请求任务,不可复用
let resultData:string
let httpRequest = http.createHttp();
let header=await HttpConfig.getHeaders();
httpRequest.request(
// 填写HTTP请求的URL地址,可以带参数也可以不带参数。URL地址需要开发者自定义。请求的参数可以在extraData中指定
url,
{
method: http.RequestMethod.GET, // 可选,默认为http.RequestMethod.GET
header:header,
connectTimeout: HttpConfig.connectTimeout, // 可选,默认为60000ms
readTimeout: HttpConfig.readTimeout, // 可选,默认为60000ms
}, (err: BusinessError, data: http.HttpResponse) => {
if (!err) {
// data.result为HTTP响应内容,可根据业务需要进行解析
console.info(JSON.stringify(data) + 'abcd')
resultData = data.result as string
let data2:T =JSON.parse(resultData)
let finaData:dataListModel =JSON.parse(resultData)
httpRequest.destroy();
// 将data.result传递给回调函数
console.info('ceces:' + JSON.stringify(finaData));
console.info('ceces:' + JSON.stringify(finaData.result));
if(finaData.msg && finaData.code !=1 && isShowToast){
promptAction.showToast({
message: finaData.msg,
duration: 1000,
bottom:showToastBottom
});
}
callback(data2);
} else {
console.error('error11:' + JSON.stringify(err));
// 取消订阅HTTP响应头事件
httpRequest.off('headersReceive');
// 当该请求使用完毕时,调用destroy方法主动销毁
httpRequest.destroy();
promptAction.showToast({
message: JSON.stringify(err.message),
duration: 1000,
bottom:showToastBottom
});
}
// return resultData
}
);
}
export async function httpRequestGetNotJson(url:string ,isShowToast:boolean,callback: (result: ArrayBuffer) => void){
let hasDefaultNet = NetworkUtil.hasDefaultNetSync();
if(!hasDefaultNet){
ToastUtil.showToast('当前没有网络,请检查网络连接!')
return;
}
// 每一个httpRequest对应一个HTTP请求任务,不可复用
let resultData:ArrayBuffer
let httpRequest = http.createHttp();
let header=await HttpConfig.getHeaders();
httpRequest.request(
// 填写HTTP请求的URL地址,可以带参数也可以不带参数。URL地址需要开发者自定义。请求的参数可以在extraData中指定
url,
{
method: http.RequestMethod.GET, // 可选,默认为http.RequestMethod.GET
header:header,
connectTimeout: HttpConfig.connectTimeout, // 可选,默认为60000ms
readTimeout: HttpConfig.readTimeout, // 可选,默认为60000ms
}, (err: BusinessError, data: http.HttpResponse) => {
if (!err) {
// data.result为HTTP响应内容,可根据业务需要进行解析
console.info(JSON.stringify(data) + 'abcd')
resultData = data.result as ArrayBuffer
callback(resultData);
} else {
console.error('error11:' + JSON.stringify(err));
// 取消订阅HTTP响应头事件
httpRequest.off('headersReceive');
// 当该请求使用完毕时,调用destroy方法主动销毁
httpRequest.destroy();
promptAction.showToast({
message: JSON.stringify(err.message),
duration: 1000,
bottom:showToastBottom
});
}
}
);
}
export async function httpRequestPost<T>(url:string,params:object|undefined,isShowToast:boolean,callback: (result: T) => void){
let hasDefaultNet = NetworkUtil.hasDefaultNetSync();
if(!hasDefaultNet){
ToastUtil.showToast('当前没有网络,请检查网络连接!')
return;
}
//console.info(url + '?accesstoken=' + token,'token12')
// 每一个httpRequest对应一个HTTP请求任务,不可复用
let resultData:string
let httpRequest = http.createHttp();
let header=await HttpConfig.getHeaders();
httpRequest.request(
// 填写HTTP请求的URL地址,可以带参数也可以不带参数。URL地址需要开发者自定义。请求的参数可以在extraData中指定
url ,
{
method: http.RequestMethod.POST, // 可选,默认为http.RequestMethod.GET
// 开发者根据自身业务需要添加header字段
header:header,
extraData: params, // 当使用POST请求时此字段用于传递内容
// expectDataType: http.HttpDataType.STRING, // 可选,指定返回数据的类型
connectTimeout: HttpConfig.connectTimeout, // 可选,默认为60000ms
readTimeout: HttpConfig.readTimeout, // 可选,默认为60000ms
}, (err: BusinessError, data: http.HttpResponse) => {
if (!err) {
// data.result为HTTP响应内容,可根据业务需要进行解析
console.info(JSON.stringify(data) + 'abcd')
// console.info('code:' + JSON.stringify(data.responseCode));
// data.header为HTTP响应头,可根据业务需要进行解析
// console.info('header:' + JSON.stringify(data.header));
// console.info('cookies:' + JSON.stringify(data.cookies)); // 8+
// 当该请求使用完毕时,调用destroy方法主动销毁
resultData = data.result as string
let data2:T =JSON.parse(resultData)
let finaData:dataListModel =JSON.parse(resultData)
httpRequest.destroy();
// 将data.result传递给回调函数
console.info('ceces:' + JSON.stringify(finaData.result));
if(finaData.msg && finaData.code !=1 && isShowToast){
promptAction.showToast({
message: finaData.msg,
duration: 1000,
bottom:showToastBottom
});
}
callback(data2);
} else {
console.error('error1:' + JSON.stringify(err));
// 取消订阅HTTP响应头事件
httpRequest.off('headersReceive');
// 当该请求使用完毕时,调用destroy方法主动销毁
httpRequest.destroy();
promptAction.showToast({
message: JSON.stringify(err.message),
duration: 1000,
bottom:showToastBottom
});
}
// return resultData
}
);
}
export async function httpRequestDelete<T>(url:string ,isShowToast:boolean,callback: (result: T) => void){
let hasDefaultNet = NetworkUtil.hasDefaultNetSync();
if(!hasDefaultNet){
ToastUtil.showToast('当前没有网络,请检查网络连接!')
return;
}
// 每一个httpRequest对应一个HTTP请求任务,不可复用
let resultData:string
let httpRequest = http.createHttp();
let header= await HttpConfig.getHeaders();
httpRequest.request(
// 填写HTTP请求的URL地址,可以带参数也可以不带参数。URL地址需要开发者自定义。请求的参数可以在extraData中指定
url,
{
method: http.RequestMethod.DELETE, // 可选,默认为http.RequestMethod.GET
header:header,
// 开发者根据自身业务需要添加header字段
// header: [{
// 'Content-Type': 'application/json',
// 'accesstoken': getToken()
// }],
// expectDataType: http.HttpDataType.STRING, // 可选,指定返回数据的类型
connectTimeout: 60000, // 可选,默认为60000ms
readTimeout: 60000, // 可选,默认为60000ms
}, (err: BusinessError, data: http.HttpResponse) => {
if (!err) {
// data.result为HTTP响应内容,可根据业务需要进行解析
console.info(JSON.stringify(data) + 'abcd')
// console.info('code:' + JSON.stringify(data.responseCode));
// data.header为HTTP响应头,可根据业务需要进行解析
// console.info('header:' + JSON.stringify(data.header));
// console.info('cookies:' + JSON.stringify(data.cookies)); // 8+
// 当该请求使用完毕时,调用destroy方法主动销毁
resultData = data.result as string
let data2:T =JSON.parse(resultData)
let finaData:dataListModel =JSON.parse(resultData)
httpRequest.destroy();
// 将data.result传递给回调函数
console.info('ceces:' + JSON.stringify(finaData));
console.info('ceces:' + JSON.stringify(finaData.result));
if(finaData.msg && finaData.code !=1 && isShowToast){
promptAction.showToast({
message: finaData.msg,
duration: 1000,
bottom:showToastBottom
});
}
callback(data2);
} else {
console.error('error11:' + JSON.stringify(err));
// 取消订阅HTTP响应头事件
httpRequest.off('headersReceive');
// 当该请求使用完毕时,调用destroy方法主动销毁
httpRequest.destroy();
promptAction.showToast({
message: JSON.stringify(err.message),
duration: 1000,
bottom:showToastBottom
});
}
// return resultData
}
);
}
更多关于HarmonyOS 鸿蒙Next HTTP.Request 数据请求封装的实战教程也可以访问 https://www.itying.com/category-93-b0.html
更多关于HarmonyOS 鸿蒙Next HTTP.Request 数据请求封装的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
在HarmonyOS鸿蒙系统中进行HTTP.Request数据请求封装实践时,重点在于利用系统提供的网络库高效、安全地处理HTTP请求。以下是一些心得:
-
引入网络库:首先,需要在项目的build.gradle文件中引入HarmonyOS提供的网络库依赖,确保能够使用相关的HTTP请求API。
-
封装HTTP请求类:创建一个HTTP请求工具类,该类封装了GET、POST等常用HTTP请求方法。在封装时,注意处理请求头、请求体、超时设置等关键参数,以及请求结果的解析。
-
异步处理:由于网络请求是耗时操作,应在异步线程中执行。可以使用HarmonyOS提供的异步任务API,如TaskExecutor,来管理异步请求。
-
错误处理:封装时,需要全面考虑网络错误、请求超时、服务器错误等情况,并给出相应的错误处理逻辑。
-
安全性:对于敏感数据的传输,应使用HTTPS协议,确保数据在传输过程中的安全性。
-
日志记录:在封装过程中,添加必要的日志记录,有助于调试和追踪问题。
通过以上步骤,可以高效地封装HTTP.Request数据请求,提高代码的可维护性和复用性。如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html。