HarmonyOS http get请求不到内容?

有一个网址,不管是编码前,还是编码后,都无法通过get请求拿到内容.但是链接地址都可以在浏览器打开,请问这个链接该如何请求.

阅读 485
1 个回答

可以使用requestInStream来解决问题,具体在官网文档处了解,链接:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/http-request-V5\#requestinstream%E6%8E%A5%E5%8F%A3%E5%BC%80%E5%8F%91%E6%AD%A5%E9%AA%A4

//参考demo如下
import { rcp } from "@kit.RemoteCommunicationKit";
import { BusinessError } from '@kit.BasicServicesKit';
import { promptAction } from '@kit.ArkUI';
import http from '@ohos.net.http';
import { util } from '@kit.ArkTS';


@Entry
@Component
struct Index {
  @State message: string = 'Hello World';

  get() {
    // 每一个httpRequest对应一个HTTP请求任务,不可复用
    let httpRequest = http.createHttp();
    // 用于订阅HTTP响应头事件
    httpRequest.on('headersReceive', (header: Object) => {
      console.info('header: ' + JSON.stringify(header));
    });
    // 用于订阅HTTP流式响应数据接收事件
    let res = new ArrayBuffer(0);
    httpRequest.on('dataReceive', (data: ArrayBuffer) => {
      const newRes = new ArrayBuffer(res.byteLength + data.byteLength);
      const resView = new Uint8Array(newRes);
      resView.set(new Uint8Array(res));
      resView.set(new Uint8Array(data), res.byteLength);
      res = newRes;
      console.info('res length: ' + res.byteLength);
      let textDecoder = util.TextDecoder.create('utf-8');
      let val = textDecoder.decodeWithStream(resView as Uint8Array);
      //在此处获取请求内容
      console.info('请求获取的内容为: ' + val);
    });
    // 用于订阅HTTP流式响应数据接收完毕事件
    httpRequest.on('dataEnd', () => {
      console.info('No more data in response, data receive end');
    });
    // 用于订阅HTTP流式响应数据接收进度事件
    class Data {
      receiveSize: number = 0;
      totalSize: number = 0;
    }
    httpRequest.on('dataReceiveProgress', (data: Data) => {
      console.log("dataReceiveProgress receiveSize:" + data.receiveSize + ", totalSize:" + data.totalSize);
    });

    let streamInfo: http.HttpRequestOptions = {
      method: http.RequestMethod.GET,  // 可选,默认为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 // 可选,协议类型默认值由系统自动指定
    }

    httpRequest.requestInStream(
      // 填写HTTP请求的URL地址,可以带参数也可以不带参数。URL地址需要开发者自定义。请求的参数可以在extraData中指定
      "url地址",
      streamInfo, (err: BusinessError, data: number) => {
      console.error('error:' + JSON.stringify(err));
      console.info('ResponseCode :' + JSON.stringify(data));
      // 取消订阅HTTP响应头事件
      httpRequest.off('headersReceive');
      // 取消订阅HTTP流式响应数据接收事件
      httpRequest.off('dataReceive');
      // 取消订阅HTTP流式响应数据接收进度事件
      httpRequest.off('dataReceiveProgress');
      // 取消订阅HTTP流式响应数据接收完毕事件
      httpRequest.off('dataEnd');
      // 当该请求使用完毕时,调用destroy方法主动销毁
      httpRequest.destroy();
    }
    );
  }

  build() {
    Column() {
      Button('点击一下').onClick(()=>{
        this.get()
        promptAction.showToast({message:'方法已执行'})
      })
    }
    .justifyContent(FlexAlign.Center)
    .height('100%')
    .width('100%')
  }
}
logo
HarmonyOS
子站问答
访问
宣传栏