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

1 回复

更多关于HarmonyOS 鸿蒙Next HTTP.Request 数据请求封装的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙系统中进行HTTP.Request数据请求封装实践时,重点在于利用系统提供的网络库高效、安全地处理HTTP请求。以下是一些心得:

  1. 引入网络库:首先,需要在项目的build.gradle文件中引入HarmonyOS提供的网络库依赖,确保能够使用相关的HTTP请求API。

  2. 封装HTTP请求类:创建一个HTTP请求工具类,该类封装了GET、POST等常用HTTP请求方法。在封装时,注意处理请求头、请求体、超时设置等关键参数,以及请求结果的解析。

  3. 异步处理:由于网络请求是耗时操作,应在异步线程中执行。可以使用HarmonyOS提供的异步任务API,如TaskExecutor,来管理异步请求。

  4. 错误处理:封装时,需要全面考虑网络错误、请求超时、服务器错误等情况,并给出相应的错误处理逻辑。

  5. 安全性:对于敏感数据的传输,应使用HTTPS协议,确保数据在传输过程中的安全性。

  6. 日志记录:在封装过程中,添加必要的日志记录,有助于调试和追踪问题。

通过以上步骤,可以高效地封装HTTP.Request数据请求,提高代码的可维护性和复用性。如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html。

回到顶部