Harmony OS 网络请求 json解析

这么久不更新,是因为我没有研究明白鸿蒙的json解析,目前就研究出来使用鸿蒙原生api解析的方式,下面就来介绍一下。

HTTP请求

首先来说下鸿蒙api中的网络请求,可以参考官方使用文档。

下面是具体的代码,可以做参考:

// 引入包名
import { http } from '@kit.NetworkKit';
import { BusinessError } from '@kit.BasicServicesKit';

// 每一个httpRequest对应一个HTTP请求任务,不可复用
let httpRequest = http.createHttp();
// 用于订阅HTTP响应头,此接口会比request请求先返回。可以根据业务需要订阅此消息
// 从API 8开始,使用on('headersReceive', Callback)替代on('headerReceive', AsyncCallback)。 8+
httpRequest.on('headersReceive', (header) => {
  console.info('header: ' + JSON.stringify(header));
});
httpRequest.request(
  // 填写HTTP请求的URL地址,可以带参数也可以不带参数。URL地址需要开发者自定义。请求的参数可以在extraData中指定
  "EXAMPLE_URL",
  {
    method: http.RequestMethod.POST, // 可选,默认为http.RequestMethod.GET
    // 开发者根据自身业务需要添加header字段
    header: {
      'Content-Type': 'application/json'
    },
    // 当使用POST请求时此字段用于传递请求体内容,具体格式与服务端协商确定
    extraData: "data to send",
    expectDataType: http.HttpDataType.STRING, // 可选,指定返回数据的类型
    usingCache: true, // 可选,默认为true
    priority: 1, // 可选,默认为1
    connectTimeout: 60000, // 可选,默认为60000ms
    readTimeout: 60000, // 可选,默认为60000ms
    usingProtocol: http.HttpProtocol.HTTP1_1, // 可选,协议类型默认值由系统自动指定
    usingProxy: false, // 可选,默认不使用网络代理,自API 10开始支持该属性
    caPath:'/path/to/cacert.pem', // 可选,默认使用系统预制证书,自API 10开始支持该属性
    clientCert: { // 可选,默认不使用客户端证书,自API 11开始支持该属性
      certPath: '/path/to/client.pem', // 默认不使用客户端证书,自API 11开始支持该属性
      keyPath: '/path/to/client.key', // 若证书包含Key信息,传入空字符串,自API 11开始支持该属性
      certType: http.CertType.PEM, // 可选,默认使用PEM,自API 11开始支持该属性
      keyPassword: "passwordToKey" // 可选,输入key文件的密码,自API 11开始支持该属性
    },
    multiFormDataList: [ // 可选,仅当Header中,'content-Type'为'multipart/form-data'时生效,自API 11开始支持该属性
      {
        name: "Part1", // 数据名,自API 11开始支持该属性
        contentType: 'text/plain', // 数据类型,自API 11开始支持该属性
        data: 'Example data', // 可选,数据内容,自API 11开始支持该属性
        remoteFileName: 'example.txt' // 可选,自API 11开始支持该属性
      }, {
        name: "Part2", // 数据名,自API 11开始支持该属性
        contentType: 'text/plain', // 数据类型,自API 11开始支持该属性
        // data/app/el2/100/base/com.example.myapplication/haps/entry/files/fileName.txt
        filePath: `${getContext(this).filesDir}/fileName.txt`, // 可选,传入文件路径,自API 11开始支持该属性
        remoteFileName: 'fileName.txt' // 可选,自API 11开始支持该属性
      }
    ]
  }, (err: BusinessError, data: http.HttpResponse) => {
    if (!err) {
      // data.result为HTTP响应内容,可根据业务需要进行解析
      console.info('Result:' + JSON.stringify(data.result));
      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方法主动销毁
      httpRequest.destroy();
    } else {
      console.error('error:' + JSON.stringify(err));
      // 取消订阅HTTP响应头事件
      httpRequest.off('headersReceive');
      // 当该请求使用完毕时,调用destroy方法主动销毁
      httpRequest.destroy();
    }
  }
);

不使用客户端正式可以删除clientCert: 请求配置。

JSON解析

  1. 在服务端返回json数据之后需要进行解析,看了网上好多文章,我在实践中是遇到问题的。问题如下
  2. 在使用JSON解析是引入 import { JSON } from '@kit.ArkTS'; 导致json解析的字段都是undefined
  3. 我的解决办法是不import ArkTs的 JSON 类,暂且叫类吧,还不知道怎么定义。

我在json解析是先定义model类

export class Response {
  data: Array = [];
  errorCode: number = -1;
  errorMsg: string = ""
}

export class Banner {
  order: number = -1;
  title: string = "";
  desc: string = "";
  imagePath: string = "";
  url: string = "";
  isVisible: number = -1;
  type: number = 1;
}

 json解析代码如下,网络请求的返回结果可以参考上面的网络请求

if (!err) {
  //获取服务端返回的json
  let jsonText = data.result.toString()
  console.log('jsonText:' + jsonText)
  let response: Response = JSON.parse(jsonText)
  console.info("errorCode=" + response.errorCode)
  console.info("errorMes=" + response.errorMsg)
  response.data.forEach((banner) => {
    console.info("banner.title=" + banner.title)
  })
} else {
  console.error('error:' + JSON.stringify(err));
  // 取消订阅HTTP响应头事件
  httpRequest.off('headersReceive');
}

gitee代码提交如下:WanHarmony: wanAndroid api 鸿蒙应用

你可能感兴趣的:(一起学鸿蒙,json,harmonyos,华为)