鸿蒙应用开发从入门到入行

第七篇 - http网络请求

导读:在本篇文章里,您将掌握鸿蒙开发工具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即可出提示,按回车即可

  • 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: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()
      }
      })
      })
    • 打印结果如下

    • 这里稍微说明一下:

      • 请求完成的回调函数里,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: 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()
      }
      )
    • 结果如下

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

    // 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的写法,也是可以的。如下

          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
      
      

    • 使用方法

      // 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 库名
    
    

鸿蒙应用开发从入门到入行 - 篇7:http网络请求的更多相关文章

  1. Python Web自动化测试入门与实战,从入门到入行

    Python Web自动化测试入门与实战 购买地址 · 京东:https://item.jd.com/69239480564.html   天猫:https://detail.tmall.com/it ...

  2. iOS开发——实战篇Swift篇&UItableView结合网络请求,多线程,数据解析,MVC实战

    UItableView结合网络请求,多线程,数据解析,MVC实战 学了这么久的swift都没有做过什么东西,今天就以自己的一个小小的联系,讲一下,怎么使用swift在实战中应用MVC,并且结合后面的高 ...

  3. LARK BOARD开发板入门学习-第2篇

    1. 本次主要研究下HDMI接口,使用芯片是CH7033,这个芯片可以接VGA和HDMI两种接口,和FPGA的接口是地址数据总线 2. 值得注意的地方,下图的D1,双二极管BAT54S在电路中一般用于 ...

  4. Win(Phone)10开发第(3)弹,简单的Demo程序网络请求json解析列表显示

    先分享一个由Json字符串直接生成解析对应的类的工具: jsonclassgenerator14 百度天气接口 下面是由一个小功能(又特么的是天气)的实现,记录下下UAP的流程和结构(其实跟之前一模一 ...

  5. iOS开发--用户点击频繁,多个异步网络请求取消问题?

    一.业务环境描述 当一个view同时添加两个tableView为subView的时候,两个tableView分别为mainTable和subTable. 当用户点击mainTable上的某一条数据时, ...

  6. 「Android 开发」入门笔记

    「Android 开发」入门笔记(界面编程篇) ------每日摘要------ DAY-1: 学习笔记: Android应用结构分析 界面编程与视图(View)组件 布局管理器 问题整理: Andr ...

  7. 浅谈入行Qt桌面端开发程序员-从毕业到上岗(1):当我们说到桌面端开发时,我们在谈论什么?

    谈谈我自己 大家好,我是轩先生,是一个刚入行的Qt桌面端开发程序员.我的本科是双非一本的数学专业,22年毕业,只是部分课程与计算机之间有所交叉,其实在我毕业的时候并没有想过会成为一名程序员,也没有想过 ...

  8. PHP开发入行真功夫 三扬科技

    前言与目录 PHP开发入行真功夫 前言 PHP开发入行真功夫 目录   第2章 基本语法 2.1.1 判断闰年程序 2.1.2 我们现在能做的…… 2.2.1 PHP的语言概貌 2.2.2 为我们的程 ...

  9. 《开发专家 Visual C 开发入行真功夫》笔记

    智能感知的功能,输入 is 后,同时按下Alt + →这两个键就出现了供选择变量.方法.宏等的列表,继续输入 in 后,isInit就出来了. stdafx.h预编译头文件,.h应用程序主头文件,do ...

  10. 最全华为鸿蒙 HarmonyOS 开发资料汇总

    开发 本示例基于 OpenHarmony 下的 JavaScript UI 框架,进行项目目录解读,JS FA.常用和自定义组件.用户交互.JS 动画的实现,通过本示例可以基本了解和学习到 JavaS ...

随机推荐

  1. Windows Terminal3.1

    其实就是为了把之前写的东西集成起来所以搞了一个终端. 下载 集成功能 Wordle ABCG RandTool cmd 便捷功能 FastFile (快速打开目标文件夹) show 文件说明 Term ...

  2. RabbitMQ协议基础及C++和Java混合开发

    目前面对大多数的需要在异构系统间进行消息传递技术路线,大多会选择socket或webservice.这两种技术的共同特点是耦合紧,调试依赖双方同步,但是效率高.除此以外,使用消息队列(MQ)的应用场景 ...

  3. 搜广推算法校招面试:BOSS直聘 推荐搜索系统工程师

      本文介绍2024届秋招中,BOSS直聘的推荐/搜索系统工程师岗位一面的面试基本情况.提问问题等.   2023年12月,赶在秋招的末尾,投递了BOSS直聘的推荐/搜索系统工程师岗位,并不清楚所在的 ...

  4. USB协议详解第9讲(USB描述符-HID描述符)

    1.HID设备概述 USB设备中有一大类就是HID设备,即Human Interface Devices,人机接口设备.这类设备包括鼠标.键盘.游戏手柄等,主要用于人与计算机进行交互.HID设备可以作 ...

  5. maven的pom.xml基础配置

    <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://mave ...

  6. 小集训 CSP-S 模拟赛

    DAY 1 A.喜剧的迷人之处在于 小思维题不必细讲 B. 镜中的野兽 状压+容斥 $ gcd (x) + lcm(x) = m $ ,可以得知 $ gcd(x) $ 一定是 m 的因子,那么就可以枚 ...

  7. KubeSphere 开源 KubeEye:Kubernetes 集群自动巡检工具

    为什么开源 KubeEye Kubernetes 作为容器编排的事实标准,虽然架构优雅功能也非常强大,但是 Kubernetes 在日常运行过程中总会有一些疑难杂症和隐性的问题让集群管理员和 Yaml ...

  8. Unity 华为快游戏JS桥接 实现写日志等功能

    之前接入微信小游戏本身代码js桥接比较完善,抖音小游戏有缺少但也没缺的这么多,华为这边的API,大残啊!官方转换插件Github仓库上一次提交在3月份.(截至现在)API给的很简略,接入js代码那里说 ...

  9. OpenPSG:离AGI再进一步,首个开放环境关系预测框架 | ECCV'24

    全景场景图生成(PSG)的目标是对对象进行分割并识别它们之间的关系,从而实现对图像的结构化理解.以往的方法主要集中于预测预定义的对象和关系类别,因此限制了它们在开放世界场景中的应用.随着大型多模态模型 ...

  10. Machine Learning Week_1 Parameter Learning 1-6

    目录 3 Parameter Learning 3.1 Video: Gradient Descent unfamiliar words 3.2 Reading:Gradient Descent un ...