鸿蒙ArkTS中的获取网络数据

**  一、通过web组件加载网页**

在C/S应用程序中,都有网络组件用于加载网页,鸿蒙ArkTS中也有类似的组件。

web组件,用于加载指定的网页,里面有很多的方法可以调用,虽然现在用得比较少,了解还是必须的。

演示代码:

import webview from '@ohos.web.webview';

@Entry
@Component
struct Index {
  myController:webview.WebviewController=new  webview.WebviewController() //控制器
  @State strWebURL:string=''  //网络地址
  @State strWebResult:string='' //返回的结果

  build() {
    Column({space:10}) {
      Row(){
        Column(){
          Row(){
            TextInput({placeholder:'请输入网址'}).layoutWeight(1).onChange((value:string)=>{this.strWebURL=value})
            Button('加载').onClick(()=>{
              // this.strWebURL = 'https://www.baidu.com';
              this.myController.loadUrl(this.strWebURL);
            })
            Button('刷新').onClick(()=>{
              this.myController.refresh();
            })
            Button('停止').onClick(()=>{
              this.myController.stop();
            })

          }
          Web({
            src:this.strWebURL,
            controller:this.myController
          }).height('100%').width('100%').zoomAccess(true).textZoomRatio(2)
        }
      }

    }.height('100%').width('100%')
  }
}

我的计算机很卡顿,一直没有重装系统,可以运行出效果,安装了Huawei Mate10的真机模拟器。

1、使用系统自带的模拟器Previewer预览时系统会提示:Property 'relativeOffset' does not exist on type 'TextAttribute'. <ArkTSCheck>,连上华为Mate10,下载安装文件后,模拟效果就出来了。

2、需要开通网络访问权限。在module.json5中配置网络访问权限:

3、注意函数名的大小写,我因为这个问题折腾了2个多小时,犯了很低级的错误。

"module": {
  "requestPermissions": [
    {
      "name": "ohos.permission.INTERNET"
    }
  ]
}

**  二、加载本地的网页并执行网页中的函数并得到返回数据**

与上面的类似,只是文件存放到resource\rawfile目录下。可以执行网页的程序并得到返回值。

import webview from '@ohos.web.webview';

@Entry
@Component
struct Index {
  myController:webview.WebviewController=new  webview.WebviewController() //控制器
  @State strResult:string=''

  build() {
    Column({space:10}) {
          Row(){
                Web({
                  src:$rawfile('test.html'),
                  controller:this.myController
                }).height(300).width('100%').javaScriptAccess(true)
          }.height(300).width('100%').backgroundColor(Color.Pink)

          Row({space:6}){
              Button('加载本地网页').onClick(()=>{
                console.log('123')
                this.myController.runJavaScript('Test()').then(result =>{
                  console.log(result)
                  this.strResult=result})
                console.log(this.strResult)
              })
              Text('返回数据:')
              Text(this.strResult)
          }.height(200).width('100%').backgroundColor(Color.Orange)
    }.height('100%').width('100%')
  }
}

效果图:

网页test.html内容:

<!DOCTYPE html>
<html>
<head>
    <title>JavaScript->函数</title>
</head>
<body>
  <div id="demo"><font size=32>JavaScript->函数</font></div>
  <input type="button" value="点击" onclick="Test123()" id="DD3"/>
  <input type="button" value="点击" onclick="Test()" id="DD3"/>
<script>
	function Test(){
		document.getElementById("demo").style.color="#d70008"
		return 'test.html返回的数据'
	}
	function Test123(){
		return '点击按钮l返回的数据'
	}
</script>
</body>
</html>

**  三、通过get和post获取网络数据**

使用http不可视组件可以通过get和post方法来获取网络数据,格式比较固定,实际使用时可以根据情况再封装一下,就是加上async和await。

代码:

import http from '@ohos.net.http';
import { JSON } from '@kit.ArkTS';

@Entry
@Component
struct MyComponent {
  @State StrReturnData_Get:string=''
  @State StrReturnData_Post:string=''
  @State strUrl_Get:string=''
  @State strUrl_Post:string=''

  objectToStringEncoding(obj:Record<string,string>) {
  let encodedStr = '';
  for (let key of Object.entries(obj)) {
      encodedStr += `${key[0]}=${encodeURIComponent(key[1])}&`;
  }
  return encodedStr.slice(0, -1); // 去除最后多余的 '&'
}
  build() {
    Column({space:10}) {
      Row(){
        Button('获取Get数据').fontSize(12).onClick(() => this.getWeatherData());
        TextInput({placeholder:'请输入网址'}).onChange((value:string)=>{this.strUrl_Get=value})
      }.width('100%').height(32)
      Row(){
        Text(this.StrReturnData_Get)
      }.layoutWeight(1)
      Row(){
        Button('获取Post数据').fontSize(12).onClick(() => this.getPostData())
        TextInput({placeholder:'请输入网址'}).onChange((value:string)=>{this.strUrl_Post=value})
      }.width('100%').height(32)
      Row(){
        Text(this.StrReturnData_Post)
      }.layoutWeight(1)
    }
  }

  getWeatherData() {
        let httpRequest =http.createHttp()
        httpRequest.request(this.strUrl_Get,
                            {
                                method:http.RequestMethod.GET,
                                header:{'Content-Type':'application/json'},
                            },
                            (error,data)=>{
                                  if(!error){
                                    this.StrReturnData_Get=data.result.toString()
                                    console.log(this.StrReturnData_Get)
                                  }
                                  else {
                                    console.log(data.responseCode.toString())
                                    console.log(JSON.stringify(error))
                                  }
                            }
        )
  }

  getPostData() {
    let httpRequest =http.createHttp()
    httpRequest.request(this.strUrl_Post,
      {
        method:http.RequestMethod.POST,
        header:{'Content-Type':'application/x-www-form-urlencoded'},
        extraData:this.objectToStringEncoding(
          {"name":"张三"}
        )
        //   readTimeout:3000,
        // connectTimeout:3000
      },
      (error,data)=>{
        if(!error){
          this.StrReturnData_Post=data.result.toString()
          console.log(this.StrReturnData_Post)
        }
        else {
          console.log(data.responseCode.toString())
          console.log(JSON.stringify(error))
        }
      }
    )
  }
}

效果:

实际上,ArkTS中封装了很多获取网络数据的组件,后面再一一学习。

相关推荐
JasonYin~2 小时前
HarmonyOS NEXT 实战之元服务:静态案例效果--- 手机一键加速、手机垃圾清理
华为·harmonyos
Freerain998 小时前
鸿蒙Next类属性观测器V2
华为·harmonyos
yg_小小程序员10 小时前
鸿蒙开发(16)使用DevEco Studio上的Git工具进行多远程仓管理
git·华为·harmonyos
JasonYin~10 小时前
HarmonyOS NEXT 实战之元服务:静态案例效果---每日玩机技巧
harmonyos
轻口味10 小时前
【每日学点鸿蒙知识】多线程限制、axios组件下载进度问题、lpx问题、Web组件全局代理、ArrayList问题
华为·harmonyos
yuanlaile10 小时前
纯Dart Flutter库适配HarmonyOS
flutter·华为·harmonyos·flutter开发鸿蒙·harmonyos教程
yuanlaile10 小时前
Flutter开发HarmonyOS 鸿蒙App的好处、能力以及把Flutter项目打包成鸿蒙应用
flutter·华为·harmonyos·flutter开发鸿蒙
JasonYin~10 小时前
HarmonyOS NEXT 实战之元服务:静态案例效果---手机查看电量
android·华为·harmonyos
李游Leo11 小时前
探索HarmonyOS Next API 13 :Camera API 照相机功能实战
harmonyos
s_daqing15 小时前
华为手机建议使用adb卸载的app
adb·华为·智能手机