鸿蒙应用开发从入门到入行 - 篇7:http网络请求

本文涉及的产品
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 DNS,旗舰版 1个月
简介: 在本篇文章里,您将掌握鸿蒙开发工具DevEco的基本使用、ArkUI里的基础组件,并通过制作一个简单界面掌握使用

HarmonyOS - 网络请求概述

  • 在应用开发中,少不了需要向云端发送请求进行交互,这就需要进行网络通信。在HarmonyOS中,把所有跟请求有关的能力全部放入了NetworkKit(系统内置网络服务工具包)里,因此用之前需要先导入
  • 目前HarmonyOS支持如下几种方式网络请求
    • http
      • 通过HTTP发起一个数据请求。
    • WebSocket
      • 使用WebSocket建立服务器与客户端的双向连接。
    • Socket
      • 通过Socket进行数据传输。
    • 网络连接管理
      • 网络连接管理提供管理网络一些基础能力,包括WiFi/蜂窝/Ethernet等多网络连接优先级管理、网络质量评估、订阅默认/指定网络连接状态变化、查询网络连接信息、DNS解析等功能。
    • MDNS
      • MDNS即多播DNS(Multicast DNS),提供局域网内的本地服务添加、移除、发现、解析等能力。
  • 本篇主要讲述http,因为咱们开发用的最多的就是它了

http请求 - 权限申请

  • 注意:如果要使用网络请求,必须申请权限

  • 哪个模块需要用,就在哪个模块的module.json5文件里进行申请

  • 如果初学者目前的项目仅有一个模块,也即创建项目自动生成的entry模块

    • 具体路径为:entry -> src -> main -> module.json5
  • 找到配置文件后,找到requestPermissions这一项

    • 若没有则创建,创建方法为,在此配置文件任意根节点处输入如下内容

          "requestPermissions": [
      
          ],
      
    • 技巧:找个根节点输入req,DevEco即可出提示,按回车即可

      image-20240903164319146

  • requestPermissions即配置你想申请的权限,格式如下

        "requestPermissions": [
          {
         
            "name": "权限名1",
            "reason": "申请原因",
            "usedScene": "使用场景
          },
          {
         
            "name": "权限名2",
            "reason": "申请原因",
            "usedScene": "使用场景"
          }
        ],
    
    • 其中name是必须填的且有固定格式,例如要申请网络权限则必须写:ohos.permission.INTERNET
    • reason和usedScene是可选的(这两个一个上架审核要用,一个对权限做更细致场景划分,目前我们暂时不用)
  • 我们目前仅需申请网络请求权限,因此做如下配置(技巧:随便输入内容关键字,DevEco都有提示,按回车即可)

     "requestPermissions": [
          {
         
            "name": "ohos.permission.INTERNET",
          }
        ]
    
  • 注:

    • 在最新版本中:即使不申请权限也能在预览器上发请求但会有警告。但若要模拟器或真机能请求,还请配置权限!

http请求 - 使用详解

基本使用

  • 使用步骤

    1. 从@kit.NetworkKit中导入http命名空间。
    2. 调用createHttp()方法,创建一个HttpRequest对象。
    3. 调用该对象的request()方法,传入http请求的url地址和可选参数,发起网络请求。
    4. 按照实际业务需要,解析返回结果。
    5. 当该请求使用完毕时,调用destroy()方法主动销毁。
  • 对应代码如下

    // 1. 引入包名
    import {
          http } from '@kit.NetworkKit';
    
    // 2. 调用createHttp()方法,创建一个HttpRequest对象。
    let httpRequest = http.createHttp();
    
    // 3. 调用该对象的request()方法,传入http请求的url地址和可选参数,发起网络请求。
    // 总结:参数1为请求路径  参数2是一个对象,用来控制请求的相关配置, 参数3是请求完成的回调函数
    httpRequest.request(
      // 请求地址
      "url",
      {
         
        method: http.RequestMethod.POST, // 请求方式,可选,默认为http.RequestMethod.GET
        // 开发者根据自身业务需要添加header字段
        header: [{
         
          // 例如指定请求体类型
          'Content-Type': 'application/json'
        }],
        // 请求携带的参数。一般情况下:post、put等请求传入对象,get请求传`key=value`形式字符串
        extraData: "data to send",
      }, (err: BusinessError, data: http.HttpResponse) => {
         
        if (!err) {
         
    
          // 4. 按照实际业务需要,解析返回结果。
          //         data.result为HTTP响应内容,可根据业务需要进行解析
          console.info('Result:' + JSON.stringify(data.result));
          console.info('code:' + JSON.stringify(data.responseCode));
          // 5. 当该请求使用完毕时,调用destroy方法主动销毁
          httpRequest.destroy();
    
        } else {
         
    
          console.error('error:' + JSON.stringify(err));
          // 5. 当该请求使用完毕时,调用destroy方法主动销毁
          httpRequest.destroy();
        }
      }
    );
    
  • 上面代码的注释请大家一定要看,因为涵盖了知识点解析

  • 当然,光看代码不如实操。我们通过请求一个get,请求一个post来试试

  • get请求接口:

    • 一个获取多条随机笑话的接口

    • url:http://ajax.zll.cool/joke/list

    • 请求参数类型:urlencoded

    • 参数:

      • num:数字,传几代表获取几条笑话
    • 响应体:

      • 返回一个字符串数组
    • 请求代码如下

      Button('发get请求')
              .onClick(() => {
             
                // 创建请求对象
                const httpRequest = http.createHttp()
                httpRequest.request('http://ajax.zll.cool/joke/list', {
             
                  // 参数
                  extraData: 'num=3'
                }, 
                // 请求完成(不管成功还是失败)都调用的回调函数
                (err: BusinessError, data: http.HttpResponse) => {
              
                  if (!err) {
             
                    // 如果err无值代表请求成功,打印响应体
                    console.info('Result:' + JSON.stringify(data.result));
                    // 销毁请求对象
                    httpRequest.destroy()
                  }
                })
              })
      
    • 打印结果如下

      image-20240904165618058

    • 这里稍微说明一下:

      • 请求完成的回调函数里,data即返回的响应内容,其中data里的result属性即为服务器返回的响应体。整个data属于HttpResponse类型,这种类型除了result以外,还有responseCode等属性,其他属性这里不做介绍,可自行翻阅官方文档

      • data.result得到的是string | Object | ArrayBuffer联合类型中的一种,因此如果服务器返回的是JSON字符串那就是string类型(例如本接口返回的就是JSON),想要使用,还得把JSON字符串转成js数据。使用JSON.parse做转换,上例没有给出。大家可自行测试,若要转换,加入以下代码

        JSON.parse(data.result.toString())
        
      • 注意:必须把result转成字符串,因为ArkTS是类型严谨的语言,result是联合类型,并不一定意味着只是字符串,所以如果不调用toString转字符串,上述代码会报错。当然你也可以用其他形式转成字符串,例如

        JSON.parse(data.result + '')
        JSON.parse(`${
                   data.result}`)
        
      • 特别需要注意的是 JSON.parse 在API12中有新的实现,如果你敲JSON时出提示按回车有可能会导入新的实现。新实现里JSON.parse类型更严谨,还需要做断言才可使用。不想断言的同学,尽量手敲JSON

      • 最后,记得要销毁请求对象,即调用:httpRequest.destroy()

        • 原因:鸿蒙官方文档上明确写出http每个请求对象只能发一次请求。所以用完即销毁,免得占用资源。(经猫林老师在现版本测试,一个对象可以发多个请求。但是为避免将来有问题,请严格按官方文档推荐:一个对象对应一个请求,用完即销毁
    • 这里顺便给各位同学一个小作业:

      • 把本接口得到的笑话,渲染到界面
  • post请求接口:

    • 一个注册用户的接口

    • url: http://ajax.zll.cool/user/reg

    • 请求参数类型:application/json

    • 参数:

      • username:用户名
    • 代码如下

                const httpRequest = http.createHttp()
                httpRequest.request('http://ajax.zll.cool/user/reg', {
             
                  method: http.RequestMethod.POST,
                  header: [
                    {
              'Content-Type': 'application/json' }
                  ],
                  extraData: {
              username: 'jack' }
                },
                  (err: BusinessError, data: http.HttpResponse) => {
             
                    if (!err) {
             
                      console.info(JSON.stringify(data.result))
                    }
      
                    httpRequest.destroy()
                  }
                )
      
    • 结果如下

      image-20240905111509842

Promise用法

  • 上述使用是完全按官方指南所写。实际上自习翻阅官方API可发现http模块是支持Promise调用的。因此,上述发请求时的第三个参数(请求完成的回调)可以不写,而改成thencatch的方式,如

    ```dart
    // get请求

          const httpRequest = http.createHttp()
          httpRequest.request('http://ajax.zll.cool/joke/list', {
            extraData: 'num=3'
          })
            .then((data: http.HttpResponse) => {
              // 成功
              console.info(JSON.stringify(data.result))
            })
            .catch((err: BusinessError) => {
              // 失败
              console.info(err.message)
            })
            .finally(() => {
              // 不管成功失败都销毁请求对象
              httpRequest.destroy()
            })
    

// post请求
const httpRequest = http.createHttp()
httpRequest.request('http://ajax.zll.cool/user/reg', {
method: http.RequestMethod.POST,
header: [
{ 'Content-Type': 'application/json' }
],
extraData: { username: 'jack' }
})
.then((data: http.HttpResponse) => {
// 成功
console.info(JSON.stringify(data.result))
})
.catch((err: BusinessError) => {
// 失败
console.info(err.message)
})
.finally(() => {
// 不管成功失败都销毁请求对象
httpRequest.destroy()
})


- 当前,前端同学可能也更喜欢把`Promise`的链式调用改成`async与await`的写法,也是可以的。如下

  ```js
        Button('发get请求')
          .onClick(async () => {
            const httpRequest = http.createHttp()
            // async和await需要自行用try-catch捕捉错误
            try {
              // 使用await直接赋值
              const data: http.HttpResponse = await httpRequest.request('http://ajax.zll.cool/joke/list', {
                extraData: 'num=3'
              })
              console.info(JSON.stringify(data.result))

            } catch (err) {
              console.info(JSON.stringify(err))
            } finally {
              httpRequest.destroy()
            }
          })

使用第三方库 - Axios

  • 没错,大伙一看上面发个请求要这么多步骤。一个对象只能发一个请求,用完还要销毁。是不是觉得很头疼呢?所以真实开发场景下,一般都会对http请求做封装,方便自己调用。但是自行封装,需要考虑的情况过多,例如get与post请求参数格式一般不一样。甚至post请求也分urlencoded与josn格式。自行封装需要做大量判断。并且因为ArkTS是强类型语言,还得预定义一些参数类才可。所以这里,猫林老师就暂且不提了。
  • 如果还是想更方便的发请求,不妨使用别人封装好的库。

  • 在鸿蒙开发中,也提供了丰富的第三方库,Axios就是其中之一。

  • Axios

    • 一款异步请求库
  • 使用步骤

    • 项目下载:DevEco打开项目后,在底部终端,敲入命令

      ohpm install @ohos/axios
      

      image-20240905112837724

    • 使用方法

      ```dart
      // get请求
      axios.get(url, {

                            params: { 参数 } 
                        })
      

      .then( (res: AxiosResponse) => {

      } )
      .catch((err: AxiosError) => {

      })

// post请求
axios.get(url, { 参数 })
  .then( (res: AxiosResponse) => {

  } )
  .catch((err: AxiosError) => {

  })  
```

- 注意:get请求参数因为一般为urlencoded,所以参数处要写`params`,post请求目前而言都是`json`,因此直接传参数
- 在axios中,响应结果类型为`AxiosResponse` ,错误类型为`AxiosError`(需导入,利用DevEco提示按回车自动导入)
  •           axios.get('http://ajax.zll.cool/joke/list', {
          params: {
          num: 3 } })
                .then((res: AxiosResponse) => {
         
                  console.info(JSON.stringify(res.data))
                })
                .catch((err: AxiosError) => {
         
                  console.info(err.message)
                })
    
  • axios本身就是基于Promise封装,因此可以把它改写成asyncawait形式。这里略过,可自行尝试。

  • 非前端出身可能更喜欢用thencatch,无论哪种写法皆可,用自己喜欢的方式

总结

  • 今日主要围绕http请求的内容而学习。主要提供两种:1.原生 2.第三方库axios

  • 如何安装第三方库?

    ohos install 库名
    
相关文章
|
1天前
|
Dart 索引
鸿蒙应用开发从入门到入行 - 篇8:Tabs选项卡页签视图切换
在本篇文章里,您将掌握使用Tabs选项卡做栏目分类,这是未来应用开发中极为常用的组件
21 7
鸿蒙应用开发从入门到入行 - 篇8:Tabs选项卡页签视图切换
|
1天前
|
JavaScript 容器
鸿蒙应用开发从入门到入行 - 篇6:数据监听器、滚动、侧滑功能
在本篇文章里,您将掌握监听器、滚动、侧滑等相关内容,助力你开发出更具交互的案例。
19 9
鸿蒙应用开发从入门到入行 - 篇6:数据监听器、滚动、侧滑功能
|
1天前
|
JavaScript Java 容器
鸿蒙应用开发从入门到入行 - 篇4:层叠布局、自定义组件、ForEach
导读:在本篇文章里,您将掌握层叠布局、自定义组件的用法,特别是自定义组件将来的开发中必然会用,其中应该特别关注自定义组件的一些规范与装饰器。
19 7
鸿蒙应用开发从入门到入行 - 篇4:层叠布局、自定义组件、ForEach
|
1天前
|
人工智能 小程序 Android开发
鸿蒙应用开发从入门到入行 - 篇1:HarmonyOS介绍——带你深入理解鸿蒙特性
本文介绍了华为的HarmonyOS(鸿蒙系统),这是一个面向全场景的分布式操作系统,不仅适用于手机和平板,还支持电脑、车机、手表、电视等多种设备。文章详细解析了鸿蒙系统的三大特性:一次开发多端部署、可分可合自由流转、统一生态原生智能,并分析了鸿蒙系统为何能蚕食安卓市场份额的原因。猫林老师认为,鸿蒙凭借其先进的技术和国内政策支持,有望在未来的市场中占据重要地位。最后,文章提供了学习鸿蒙系统的建议和一些课后练习,帮助读者更好地理解和掌握这一系统。
25 7
鸿蒙应用开发从入门到入行 - 篇1:HarmonyOS介绍——带你深入理解鸿蒙特性
|
8天前
|
SQL 安全 网络安全
网络安全与信息安全:知识分享####
【10月更文挑战第21天】 随着数字化时代的快速发展,网络安全和信息安全已成为个人和企业不可忽视的关键问题。本文将探讨网络安全漏洞、加密技术以及安全意识的重要性,并提供一些实用的建议,帮助读者提高自身的网络安全防护能力。 ####
46 17
|
18天前
|
存储 SQL 安全
网络安全与信息安全:关于网络安全漏洞、加密技术、安全意识等方面的知识分享
随着互联网的普及,网络安全问题日益突出。本文将介绍网络安全的重要性,分析常见的网络安全漏洞及其危害,探讨加密技术在保障网络安全中的作用,并强调提高安全意识的必要性。通过本文的学习,读者将了解网络安全的基本概念和应对策略,提升个人和组织的网络安全防护能力。
|
19天前
|
SQL 安全 网络安全
网络安全与信息安全:关于网络安全漏洞、加密技术、安全意识等方面的知识分享
随着互联网的普及,网络安全问题日益突出。本文将从网络安全漏洞、加密技术和安全意识三个方面进行探讨,旨在提高读者对网络安全的认识和防范能力。通过分析常见的网络安全漏洞,介绍加密技术的基本原理和应用,以及强调安全意识的重要性,帮助读者更好地保护自己的网络信息安全。
40 10
|
21天前
|
SQL 安全 网络安全
网络安全与信息安全:关于网络安全漏洞、加密技术、安全意识等方面的知识分享
在数字化时代,网络安全和信息安全已成为我们生活中不可或缺的一部分。本文将介绍网络安全漏洞、加密技术和安全意识等方面的内容,并提供一些实用的代码示例。通过阅读本文,您将了解到如何保护自己的网络安全,以及如何提高自己的信息安全意识。
46 10
|
21天前
|
存储 监控 安全
云计算与网络安全:云服务、网络安全、信息安全等技术领域的融合与挑战
本文将探讨云计算与网络安全之间的关系,以及它们在云服务、网络安全和信息安全等技术领域中的融合与挑战。我们将分析云计算的优势和风险,以及如何通过网络安全措施来保护数据和应用程序。我们还将讨论如何确保云服务的可用性和可靠性,以及如何处理网络攻击和数据泄露等问题。最后,我们将提供一些关于如何在云计算环境中实现网络安全的建议和最佳实践。
|
22天前
|
监控 安全 网络安全
网络安全与信息安全:漏洞、加密与意识的交织
在数字时代的浪潮中,网络安全与信息安全成为维护数据完整性、保密性和可用性的关键。本文深入探讨了网络安全中的漏洞概念、加密技术的应用以及提升安全意识的重要性。通过实际案例分析,揭示了网络攻击的常见模式和防御策略,强调了教育和技术并重的安全理念。旨在为读者提供一套全面的网络安全知识框架,从而在日益复杂的网络环境中保护个人和组织的资产安全。

热门文章

最新文章