websocket和http数据请求示例

  •  使用websocket通信
  •  使用http通信
HarmonyOS
2024-05-28 20:30:04
浏览
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
越来越认真了

使用的核心API

核心代码解释

  • 配置权限    在module.json5中添加对应的权限
"requestPermissions": [ 
      { 
        "name": "ohos.permission.INTERNET" 
      }, 
      { 
        "name": "ohos.permission.READ_MEDIA" 
      }, 
      { 
        "name": "ohos.permission.WRITE_MEDIA" 
      } 
    ]
  •  websocket连接
create_websocket() { 
    ws.on('open', (err, value) => { 
      // console.log("on open, status:" + value['status'] + ", message:" + value['message']); 
      console.log("on open, value = " + JSON.stringify(value)); 
      toast('connect websocket, value = ' + JSON.stringify(value)); 
      // 当收到on('open')事件时,可以通过send()方法与服务器进行通信 
      // ws.send("Hello, server!", (err, value) => { 
      //   if (!err) { 
      //     console.log("send success"); 
      //   } else { 
      //     console.log("send fail, err:" + JSON.stringify(err)); 
      //   } 
      // }); 
    }); 
    ws.on('message', (err, value) => { 
      console.log("on message, message:" + value); 
      // 当收到服务器的`bye`消息时(此消息字段仅为示意,具体字段需要与服务器协商),主动断开连接 
      if (value === 'bye') { 
        ws.close((err, value) => { 
          if (!err) { 
            console.log("close success"); 
          } else { 
            console.log("close fail, err is " + JSON.stringify(err)); 
          } 
        }); 
      } 
    }); 
    ws.on('close', (err, value) => { 
      console.log("on close, code is " + value.code + ", reason is " + value.reason); 
    }); 
    ws.on('error', (err) => { 
      console.log("on error, error:" + JSON.stringify(err)); 
    }); 
    ws.connect(this.wsAddress, (err, value) => { 
      if (!err) { 
        console.log("connect success"); 
        toast('connect success, value = ' + JSON.stringify(value)); 
      } else { 
        console.log("connect fail, err:" + JSON.stringify(err)); 
        toast('connect fail, err = ' + JSON.stringify(err)); 
      } 
    }); 
  }
  •  websocket发送数据
send_msg() { 
    ws.send(this.text, (err, value) => { 
      if (!err) { 
        console.log("send success"); 
        toast('send message success, msg = ' + this.text); 
      } else { 
        console.log("send fail, err:" + JSON.stringify(err)); 
        toast('send message fail, error = ' + JSON.stringify(err)); 
      } 
    }); 
  }
  • 复制证书到沙箱路径
copy_cert() { 
    try { 
      //读取项目资源文件(rawfile路径下) 
      let context = getContext(this) as common.UIAbilityContext; 
      let fileDir = context.filesDir; 
      let client = context.getApplicationContext().resourceManager.getRawFileContentSync('gitee.pem') 
      if (client != null) { 
        this.certPath = fileDir + "/baidu.pem"; 
        let file = fs.openSync(this.certPath ,fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE); 
        fs.writeSync(file.fd, client.buffer); 
        fs.fsyncSync(file.fd); 
        fs.closeSync(file); 
        toast('复制证书成功' + this.certPath); 
      } else { 
        toast('复制证书失败' + this.certPath); 
        console.warn('cert file is not exist.') 
      } 
    } catch (err) { 
      console.warn('copy cert file fail:' + err) 
      toast('复制证书失败' + err); 
    } 
  }
  • 请求数据
// 字符串转ArrayBuffer 
  stringToArrayBuffer(str: string): ArrayBuffer { 
    let uint8Array: Uint8Array = new Uint8Array(buffer.from(str).buffer) 
    return uint8Array.buffer; 
  } 
  
  request(): void { 
    // 每一个httpRequest对应一个HTTP请求任务,不可复用 
    let httpRequest = http.createHttp(); 
  
    // 用于订阅HTTP响应头,此接口会比request请求先返回。可以根据业务需要订阅此消息 
    // 从API 8开始,使用on('headersReceive', Callback)替代on('headerReceive', AsyncCallback)。 8+ 
    httpRequest.on('headersReceive', (header: Object) => { 
      console.info('header: ' + JSON.stringify(header)); 
    }); 
  
    class ExtraData { 
      public data: string; 
  
      constructor(data: string) { 
        this.data = data; 
      } 
    } 
  
    class Header { 
      public contentType: string; 
  
      constructor(contentType: string) { 
        this.contentType = contentType; 
      } 
    } 
  
    // 字节流参数 
    let param: ArrayBuffer = this.stringToArrayBuffer('hello'); 
  
    // Map转Json字符串 
    const map = new Map([ 
      ['content-type', 'application/octet-stream'], 
    ]); 
  
    let jsonObject: Record<string, Object> = {} 
    map.forEach((value, key) => { 
      if (key != undefined && value != undefined) { 
        jsonObject[key] = value; 
      } 
    }) 
  
    httpRequest.request(// 填写HTTP请求的URL地址,可以带参数也可以不带参数。URL地址需要开发者自定义。请求的参数可以在extraData中指定 
      "https://gitee.com/openharmony/docs/events.json", 
      // "http://httpbin.org/post", 
      { 
        // method: http.RequestMethod.POST, // 可选,默认为http.RequestMethod.GET 
        // 当使用POST请求时此字段用于传递内容 
        extraData: new ExtraData('data to send'), 
        // expectDataType: http.HttpDataType.STRING, // 可选,指定返回数据的类型 
        // usingCache: true, // 可选,默认为true 
        priority: 1, // 可选,默认为1 
        // 开发者根据自身业务需要添加header字段 
        // header: new Header('application/json'), 
        header: new Header('application/octet-stream'), 
        readTimeout: 60000, // 可选,默认为60000ms 
        connectTimeout: 60000, // 可选,默认为60000ms 
        usingProtocol: http.HttpProtocol.HTTP1_1, // 可选,协议类型默认值由系统自动指定 
        // usingProxy: false, //可选,默认不使用网络代理,自API 10开始支持该属性 
        // caPath: '/path/to/cacert.pem', // 可选,默认使用系统预设CA证书,自API 10开始支持该属性 
        caPath: this.certPath, 
        // 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)); 
          console.info('type:' + JSON.stringify(data.resultType)); 
          // data.header为HTTP响应头,可根据业务需要进行解析 
          console.info('header:' + JSON.stringify(data.header)); 
          console.info('cookies:' + JSON.stringify(data.cookies)); // 自API version 8开始支持cookie 
          // 取消订阅HTTP响应头事件 
          httpRequest.off('headersReceive'); 
          // 当该请求使用完毕时,开发者务必调用destroy方法主动销毁该JavaScript Object。 
          httpRequest.destroy(); 
          toast('result = ' + JSON.stringify(data.result)) 
        } else { 
          console.info('error:' + JSON.stringify(err)); 
          // 取消订阅HTTP响应头事件 
          httpRequest.off('headersReceive'); 
          // 当该请求使用完毕时,开发者务必调用destroy方法主动销毁该JavaScript Object。 
          httpRequest.destroy(); 
        } 
      }); 
  }

实现效果

注明适配的版本信息

IDE版本:4.1.3.500

SDK版本:HarmonyOS Next Developer Preview1

分享
微博
QQ
微信
回复
2024-05-29 21:33:25
相关问题
http request 请求不到接口数据
4952浏览 • 1回复 待解决
使用http模块实现数据请求
1092浏览 • 1回复 待解决
HarmonyOS http请求的JSON数据定义问题
228浏览 • 1回复 待解决
http请求支持patch方法
2077浏览 • 1回复 待解决
求告知如何发起HTTP请求
452浏览 • 1回复 待解决
使用http请求网络地址
839浏览 • 1回复 待解决
HarmonyOS http请求返回2300007
695浏览 • 1回复 待解决
HTTP GET请求时如何传递参数?
3124浏览 • 1回复 待解决
http 请求一直报 2300058
1645浏览 • 0回复 待解决
应用中http请求响应2300023
2144浏览 • 1回复 待解决
HarmonyOS http 请求 post 参数问题
993浏览 • 1回复 待解决
HTTP请求使用同一SESSIONID
531浏览 • 1回复 待解决
http请求证书校验实现
392浏览 • 1回复 待解决
http 请求 如何cookie持久化?
2011浏览 • 1回复 待解决