鸿蒙系统开发【Http】网络

Http

介绍

本示例通过@ohos.net.http等接口,实现了根据URL地址和相关配置项发起http请求的功能。

效果预览

1

使用说明

1.启动应用可配置网络请求,设置网址、请求方式、请求参数;

2.点击确认按钮,跳转请求结果页面;

3.点击返回按钮,返回配置页面;

4.支持将本示例中的http模块编译成tgz包。

具体实现

  • 本示例将发送http请求的接口封装在Http模块,源码参考:[http.ts]
/*
 * Copyright (c) 2022 Huawei Device Co., Ltd.
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

import { http } from '@kit.NetworkKit'

class Http {
  url: string
  extraData: Object
  options: http.HttpRequestOptions

  constructor() {
    this.url = ''
    this.options = {
      method: http.RequestMethod.GET,
      extraData: this.extraData,
      header: { 'Content-Type': 'application/json' },
      readTimeout: 50000,
      connectTimeout: 50000
    }
  }

  setUrl(url: string) {
    this.url = url
  }

  setMethod(method: string) {
    switch (method) {
      case 'GET':
        this.options.method = http.RequestMethod.GET;
        break
      case 'HEAD':
        this.options.method = http.RequestMethod.HEAD;
        break
      case 'OPTIONS':
        this.options.method = http.RequestMethod.OPTIONS;
        break
      case 'TRACE':
        this.options.method = http.RequestMethod.TRACE;
        break
      case 'DELETE':
        this.options.method = http.RequestMethod.DELETE;
        break
      case 'POST':
        this.options.method = http.RequestMethod.POST;
        break
      case 'PUT':
        this.options.method = http.RequestMethod.PUT;
        break
      case 'CONNECT':
        this.options.method = http.RequestMethod.CONNECT;
        break
      default:
        this.options.method = http.RequestMethod.GET;
        break
    }
  }

  setExtraData(extraData: Object) {
    this.options.extraData = extraData
  }

  setOptions(option: Object) {
    this.options = option
  }

  setList(list: number[], flag: number) {
    list = []
    for (let i = 0; i < flag; i++) {
      list[i] = i
    }
    return list
  }

  setParameter(keys: string[], values: string[]) {
    let result = {}
    for (let i = 0; i <= keys.length - 1; i++) {
      let key = keys[i]
      let value = values[i]
      result[key] = value
    }
    return result
  }

  async request() {
    let httpRequest = http.createHttp()
    httpRequest.on('dataReceive', function (data) {
      AppStorage.setOrCreate('dataLength', data.byteLength);
      console.info('[ Demo dataReceive ]  ReceivedDataLength: ' + data.byteLength);
    });
    httpRequest.on('dataReceiveProgress', function (data) {
      AppStorage.setOrCreate('receiveSize', data.receiveSize);
      AppStorage.setOrCreate('totalSize', data.totalSize);
      console.info('[ Demo dataProgress ]  ReceivedSize: ' + data.receiveSize + ' TotalSize: ' + data.totalSize);
    });
    httpRequest.requestInStream(this.url, this.options);
  }
}

export default new Http()
  • 发起请求:在[MainPage.ets] 通过TextInput组件获取参数,点击“确认”按钮后通过Http.request()方法调用http.createHttp().request()接口向指定的地址发送请求。
/*
 * Copyright (c) 2022-2023 Huawei Device Co., Ltd.
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

import { router } from '@kit.ArkUI'
import Http from '../model/http'

AppStorage.setOrCreate('receiveSize', 0)
AppStorage.setOrCreate('totalSize', 0)
AppStorage.setOrCreate('dataLength', 0)

@Entry
@Component
export struct setting {
  private getUri: string = ''
  private getOption?: object
  @State url: string = ''
  @State option?: object = undefined
  @State flag: number = 1
  @State keys: string[] = []
  @State list: number[] = [0]
  @State values: string[] = []
  @State result: string = ''
  @State method: string = 'GET'
  @State showPage: boolean = false
  @State resultInfo: string = ''
  @State methods: Array<string> = ['GET', 'HEAD', 'OPTIONS', 'TRACE', 'DELETE', 'POST', 'PUT', 'CONNECT']

  @Builder MenuBuilder() {
    Column() {
      ForEach(this.methods, (item: string) => {
        Text(item)
          .margin(5)
          .fontSize(16)
          .textAlign(TextAlign.Center)
          .onClick(() => {
            this.method = item
          })

        Divider().height(1)
      }, (item: string) => item.toString())
    }
    .width('180vp')
  }

  aboutToAppear() {
    this.url = this.getUri
    this.option = this.getOption
    Http.setUrl(this.url)
    let context: Context = getContext(this)
    this.resultInfo = context.resourceManager.getStringSync($r('app.string.result').id)
    setInterval(() => {
      if (Http.url !== '') {
        this.result = "\r\nThe length of the data received by this callback: " +
        JSON.stringify(AppStorage.get('dataLength') as number) +
        "\r\n" + "The length of the data received: " +
        JSON.stringify(AppStorage.get('receiveSize') as number) + "\r\n" + "Total length of data: " +
        JSON.stringify(AppStorage.get('totalSize') as number) + "\r\n" + "Percentage: " +
        JSON.stringify(Math.floor((AppStorage.get('receiveSize') as number) /
        (AppStorage.get('totalSize') as number) * 10000) / 100) + '%'
      } else {
        this.result = 'Failed'
      }
    }, 10)
  }

  build() {
    Scroll() {
      Column() {
        if (!this.showPage) {
          Text($r('app.string.configuration'))
            .margin('2%')
            .fontSize(28)

          Row() {
            Text(this.method)
              .width('20%')
              .fontSize(18)
              .textAlign(TextAlign.Center)
              .bindMenu(this.MenuBuilder)
              .margin({ left: 2, right: 4 })

            TextInput({ placeholder: $r('app.string.web') })
              .width('75%')
              .margin({ left: 4, right: 2 })
              .enableKeyboardOnFocus(false)
              .onChange((value: string) => {
                this.url = value
              })
              .id('GET')
          }
          .width('95%')
          .height('10%')

          ForEach(this.list, (item: number, index: number) => {
            Row() {
              Text('Key: ')
                .width('20%')
                .fontSize(18)
                .margin({ left: 2, right: 4 })
                .textAlign(TextAlign.Center)
              TextInput({ placeholder: $r('app.string.key') })
                .width('76%')
                .margin({ left: 4, right: 2 })
                .onChange((value: string) => {
                  this.keys[this.flag - 1] = value
                })
                .id(`key${index + 1}`)
            }
            .width('95%')
            .height('10%')

            Row() {
              Text('Value: ')
                .width('20%')
                .fontSize(18)
                .margin({ left: 2, right: 4 })
                .textAlign(TextAlign.Center)
              TextInput({ placeholder: $r('app.string.value') })
                .width('75%')
                .margin({ left: 4, right: 2 })
                .onChange((value: string) => {
                  this.values[this.flag -1] = value
                })
                .id(`value${index + 1}`)
            }
            .width('95%')
            .height('10%')
          }, (item: number) => item.toString())

          Column() {
            Button($r('app.string.add'))
              .margin(10)
              .fontSize(20)
              .width('60%')
              .onClick(() => {
                this.flag += 1
                this.list = Http.setList(this.list, this.flag)
              })
              .id('add')

            Button($r('app.string.reduce'))
              .margin(10)
              .fontSize(20)
              .width('60%')
              .onClick(() => {
                if (this.flag !== 1) {
                  this.flag -= 1
                }
                this.list = Http.setList(this.list, this.flag)
              })
              .id('reduce')

            Button($r('app.string.reset'))
              .id('reset')
              .margin(10)
              .fontSize(20)
              .width('60%')
              .onClick(() => {
                this.flag = 1
                this.list = [0]
              })

            Button($r('app.string.confirm'))
              .margin(10)
              .fontSize(20)
              .width('60%')
              .onClick(async () => {
                Http.setUrl(this.url)
                Http.setMethod(this.method)
                Http.setExtraData(Http.setParameter(this.keys, this.values))
                try {
                  Http.request()
                } catch (err) {
                  this.result = 'Failed'
                }
                this.showPage = !this.showPage
              })
              .id('submit')

            Button($r('app.string.back'))
              .id('back')
              .margin(10)
              .fontSize(20)
              .width('60%')
              .onClick(() => {
                router.replaceUrl({
                  url: 'pages/Index',
                  params: {
                    url: this.url === '' ? Http.url : this.url,
                    option: Http.options
                  }
                })
              })
          }
          .margin({ top: '2%', bottom: '2%' })
          .width('100%')
        } else {
          Text(`${this.resultInfo} ${this.result}`)
            .id(`${this.result === '' || this.result === 'Failed' ? 'failed' : 'succeed'}`)
            .fontSize(20)
            .margin('5%')

          Button($r('app.string.back'))
            .fontSize(25)
            .onClick(() => {
              AppStorage.setOrCreate('receiveData', 0)
              AppStorage.setOrCreate('totalSize', 0)
              AppStorage.setOrCreate('dataLength', 0)
              this.url = ''
              this.flag = 1
              this.keys = []
              this.list = [0]
              this.values = []
              this.result = ''
              this.method = 'GET'
              this.showPage = !this.showPage
            })
            .id('back')
        }
      }
    }
    .width('100%')
    .height('100%')
  }
}

以上就是本篇文章所带来的鸿蒙开发中一小部分技术讲解;想要学习完整的鸿蒙全栈技术。可以在结尾找我可全部拿到!
下面是鸿蒙的完整学习路线,展示如下:
1

除此之外,根据这个学习鸿蒙全栈学习路线,也附带一整套完整的学习【文档+视频】,内容包含如下

内容包含了:(ArkTS、ArkUI、Stage模型、多端部署、分布式应用开发、音频、视频、WebGL、OpenHarmony多媒体技术、Napi组件、OpenHarmony内核、鸿蒙南向开发、鸿蒙项目实战)等技术知识点。帮助大家在学习鸿蒙路上快速成长!

鸿蒙【北向应用开发+南向系统层开发】文档

鸿蒙【基础+实战项目】视频

鸿蒙面经

在这里插入图片描述

为了避免大家在学习过程中产生更多的时间成本,对比我把以上内容全部放在了↓↓↓想要的可以自拿喔!谢谢大家观看!

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值