HarmonyOS---权限和http/Axios网络请求

网络请求(http,axios)

目录

  • 一、应用权限管理
    • 1.1权限的等级
    • 1.2授权方式
    • 1.3声明权限的配置
    • 1.4如何向用户进行申请
  • 二、内置http请求使用
  • 三、Axios请求使用(建议)
    • 3.1 使用方式一
    • 3.2 使用方式二(建议)


一、应用权限管理

应用权限保护的对象分数据和功能的:

  • 数据:个人(照片,通讯录,日历,位置)、设备(标识码,相机,麦克风)

  • 功能:设备(摄像头/麦克风、电话、联网)、应用(悬浮窗、快捷方式、唤起第三方应用、后台运行)

1.1权限的等级

system_core: 该等级提供应用服务操作系统的 - 核心能力
system_basic:该等级提供应用服务的 - 基础服务
normal: 普通的基本应用:默认

1.2授权方式

system_grant:系统授权
指的是系统类型的权限,应用被允许访问的数据不会涉及到用户或设备的敏感信息
安装应用是,应用会询问系统,系统会自动进行授权。
user_grant:用户授权
指的是涉及用户隐私或敏感数据的,如果出现问题,是不可控的。
应用安装后,运行时,会指定弹窗,询问用户是否允许获取权限。

授权申请

1.3声明权限的配置

entry/src/main/module.json5 配置文件中,声明权限:

例:当不需要用户确认和用户确认运行都需要在requestPermissions[]中进行配置:

1. 不需要用户确认:
	{
        "name": "ohos.permission.INTERNET"  //权限名称:网络
      },
2. 用户确认 (当需要用户确认时,填写配置信息会有提示,不填则报错)
例:在卡片Call机制中也用到了,保持后台应用:
格式:
	{
        "name": "ohos.permission.LOCATION", //定位
        "reason": "$string:reason_loc",      //描述申请的原因:user_grant时,必填项,因为需要国际化需要在语言文件中设置才可以
        "usedScene": {                       //描述权限使用的场景:user_grant时,必填项
          "abilities": [ "EntryAbility" ],   //标识需要使用该权限的 Ability
          "when": "always"                   //标识使用的时机:inuse:只允许前台, always:前后台都允许
        }

1.4如何向用户进行申请

:定位
import abilityAccessCtrl from '@ohos.abilityAccessCtrl'; //权限控制管理

onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {
    //唤醒用户授权窗口,只有在user_grant情况下有效
    try{
      //创建一个权限管理对象
      const manager = abilityAccessCtrl.createAtManager()
      //基于管理对象,申请用户授权
      manager.requestPermissionsFromUser( this.context, [
        "ohos.permission.LOCATION",
        "ohos.permission.APPROXIMATELY_LOCATION",
        ...
      ] )
    }
    catch(err){
      promptAction.showToast({message:'获取位置失败!'})
    }
    hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onCreate');
  }

扩展:请求方式
GET:
短文本请求,是一种不安全的请求,所有的信息都暴露在地址栏中。
内容的上限是255个字节。
通常都是直接打开网址、超链接a它们使用。
POST:
长文本请求,是一种安全的请求,基于http超文本传输协议的。
数据信息是通过TCP/IP请求协议进行处理的,用户不可见。
数据上限:2MB
如今,我们有一个RestFul请求风格定义,它扩展了更多的请求方式:并不是所有后端服务器都支持

PUT:
    本质还是post请求。

DELETE:
    本质还是get请求。

二、内置http请求使用

可能会存在个版本不兼容问题:建议使用Axios

在这里插入图片描述

1.开启网络权限: 'ohos.permission.INTERNET'
2.导包: import http from '@ohos.net.http'
3.请求:
 		//创建网络请求对象
        const httpRequest:http.HttpRequest = http.createHttp()
		// 方式一:异步
        //异步方法:data就是响应回发的结果
        //httpRequest.request('url', {...}, (err,data)=>{})

		// 方式二: 同步
        //转同步操作
        try{
          const res:http.HttpResponse = await httpRequest.request(
            'https://jsonplaceholder.typicode.com/users',
            {method: http.RequestMethod.GET}   //get请求方式:默认
          )
          //处理请求结果:得到一个json对象
          console.info('http===', res.responseCode)           //状态码
          console.info('http===', JSON.stringify(res.header)) //头部信息
          console.info('http===', JSON.stringify(res.result)) //数据结果
        }
        catch(err){
          console.info('http===', err)
        }
        finally{
          //不管成功还是失败,最终,始终关闭请求对象
          httpRequest.destroy()
        }
封装工具包格式:
 // 内置http
import http from '@ohos.net.http'
import promptAction from '@ohos.promptAction'

export default class HttpUtils {
  // 青云客:(第三方)
  private static readonly path: string = 'http://api.qingyunke.com'
  // 美团:(个人)
  // https://atstudy-1253850831.cos.ap-shanghai.mygcloud.com
  static async httpRequest(url: string, method: http.RequestMethod = http.RequestMethod.GET,
    extraData: string | Object | ArrayBuffer = ''): Promise<http.HttpResponse> {
    const link = http.createHttp()
    let res: http.HttpResponse = {} as http.HttpResponse
    try {
      res = await link.request(HttpUtils.path + url, {
        method: method, extraData: extraData
      })
    } catch (err) {
      promptAction.showToast({
        message: '网络请求异常' + JSON.stringify(err)
      })
    } finally {
      //不管成功还是失败,最终,始终关闭请求对象
      link.destroy()
    }
    return res

    //处理请求结果:得到一个json对象
    // console.info('http===', res.responseCode)           //状态码
    // console.info('http===', JSON.stringify(res.header)) //头部信息
    // console.info('http===', JSON.stringify(res.result)) //数据结果
  }
}

三、Axios请求使用(建议)

使用Axios需要安装ohpm中的 axios依赖或者在oh-package.json5 加入依赖
方式一:根据命令安装:ohpm install @ohos/axios
方式二:“@ohos/axios”:“^2.2.0”

3.1 使用方式一

直接调用get(),post(), 不建议使用,原因路径每次都是完整的,有重复性

:
开启网络权限: 'ohos.permission.INTERNET'
导包: import axios  from '@ohos/axios'
axios.get('url',{params:{}})
axios.post('url')

3.2 使用方式二(建议)

定义出来公用部分,若不相同可以在调用时进行覆盖

:
开启网络权限: 'ohos.permission.INTERNET'
导包: import axios  from '@ohos/axios'
// 1.公共部分
 const cont =  axios.create({
    baseURL:'https://atstudy-1253850831.cos.ap-shanghai.myqcloud.com', // 公用部分的url
    //transformRequest:()=>{}, // 发送请求前的操作函数 // 知道别用出错有点难找
    //transformResponse:()=>{}, // 接收结果  // 知道别用出错有点难找
    timeout:3*1000, // 请求超时时间
    headers:{} // 头部数据
  })
  // 格式: 2.调用 cont.get() /  cont.post()
  // 此处使用的异步,也可以转为async同步
  cont.get('/lab-d3/harmonyOS/meituan/shop.json',
		 {timeout:6*1000} // 重写超时时间
		 ).then((res: AxiosResponse) => {
	       if (res.status == 200) { // 状态码
	         res.data // 返回数据
	       }
	     })
	       .catch((err: BusinessError) => {
	         promptAction.showToast({ message: "get请求异常"})
	       })
	       .finally(() => {  })
Axios工具包:
当需要多个url时则就需要发生变更了,使用构造传参方式就可以
import axios, { AxiosInstance } from '@ohos/axios'
export default class AxiosUtils {
  // 青云客:(第三方)
  private static readonly path: string = 'http://api.qingyunke.com'
  private static  link(): AxiosInstance {
    return axios.create({
      baseURL: AxiosUtils.path,
      timeout:3*1000, // 请求超时时间
      headers:{}, // 头部数据
      timeoutErrorMessage: '连接超时'
    })
  }

  public static get(url: string,params:string='' ) {
    return AxiosUtils.link().get(url+'?'+params)
  }
  public static post(url: string,data:ResourceStr|object='' ) {
    return AxiosUtils.link().post(url,data)
  }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/883746.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Leetcode面试经典150题-322.零钱兑换

给你一个整数数组 coins &#xff0c;表示不同面额的硬币&#xff1b;以及一个整数 amount &#xff0c;表示总金额。 计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额&#xff0c;返回 -1 。 你可以认为每种硬币的数量是无限的。 示…

uniapp 常用高度状态栏,导航栏,tab栏,底部安全高度

实际效果 使用 //使用 let posConfig this.getPosConfig(); // 传false返回值为 px大小 console.log(posConfig.safeBottomH) // 入参 是否转换为rpxgetPosConfig(toRpx true) {const systemInfo uni.getSystemInfoSync();// #ifdef MPconst menuButtonInfo uni.getMenuBu…

基于RPA+BERT的文档辅助“悦读”系统 | OPENAIGC开发者大赛高校组AI创作力奖

在第二届拯救者杯OPENAIGC开发者大赛中&#xff0c;涌现出一批技术突出、创意卓越的作品。为了让这些优秀项目被更多人看到&#xff0c;我们特意开设了优秀作品报道专栏&#xff0c;旨在展示其独特之处和开发者的精彩故事。 无论您是技术专家还是爱好者&#xff0c;希望能带给…

Linux云计算 |【第四阶段】NOSQL-DAY2

主要内容&#xff1a; Redis集群概述、部署Redis集群&#xff08;配置manage管理集群主机、创建集群、访问集群、添加节点、移除节点&#xff09; 一、Redis集群概述 1、集群概述 所谓集群&#xff0c;就是通过添加服务器的数量&#xff0c;提供相同的服务&#xff0c;从而让…

计算机毕业设计之:微信小程序的校园闲置物品交易平台(源码+文档+讲解)

博主介绍&#xff1a; ✌我是阿龙&#xff0c;一名专注于Java技术领域的程序员&#xff0c;全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师&#xff0c;我在计算机毕业设计开发方面积累了丰富的经验。同时&#xff0c;我也是掘金、华为云、阿里云、InfoQ等平台…

卷积神经网络-迁移学习

文章目录 一、迁移学习1.定义与性质2.步骤 二、Batch Normalization&#xff08;批次归一化&#xff09;三、ResNet网络1.核心思想2.残差结构&#xff08;1&#xff09;残差块&#xff08;2&#xff09;残差结构类型 四、总结 一、迁移学习 迁移学习&#xff08;Transfer Lear…

书生大模型实战营学习[9] OpenCompass 评测 InternLM-1.8B 实践

准备工作 打开开发机&#xff0c;选择cuda11.7环境&#xff0c;A100选择10%&#xff0c;点击创建&#xff0c;然后进入开发机即可&#xff0c;和之前的操作一样。接下来创建环境&#xff0c;下载必要的依赖包 conda create -n opencompass python3.10 conda install pytorch2…

Altium Designer(AD)百度云下载与安装(附安装步骤)

在我们日常使用当中&#xff0c;Altium designer常常也被简称为AD&#xff0c;是一款一体化的电子产品开发系统软件&#xff0c;主要运行在Windows操作系统上。 我们通过Altium designer把原理图设计、电路仿真、PCB绘制编辑、拓扑逻辑自动布线、信号完整性分析和设计输出等技…

Eclipse Memory Analyzer (MAT)提示No java virtual machine was found ...解决办法

1&#xff0c;下载mat后安装&#xff0c;打开时提示 jdk版本低&#xff0c;需要升级到jdk17及以上版本&#xff0c;无奈就下载了jdk17&#xff0c;结果安装后提示没有jre环境&#xff0c;然后手动生成jre目录&#xff0c;命令如下&#xff1a; 进入jdk17目录&#xff1a;执行&…

鸿蒙界面开发(九):列表布局 (List)

列表布局 当列表项达到一定数量&#xff0c;内容超过屏幕大小时&#xff0c;可以自动提供滚动功能。它适合用于呈现同类数据类型或数据类型集&#xff0c;例如图片和文本。在列表中显示数据集合是许多应用程序中的常见要求&#xff08;如通讯录、音乐列表、购物清单等&#xf…

Uniapp 微信小程序 最新 获取用户头像 和 昵称 方法 有效可用

文章目录 前言代码实现运行效果技术分析 前言 同事有个需求 授权获取用户头像 和 昵称 。之前做过线上小程序发版上线流程 就实现了下 最新的方法和 api 有些变化 记录下 代码实现 先直接上代码 <template><view class"container"><buttonclass&qu…

解决macOS安装redis以后不支持远程链接的问题

参考文档:https://blog.csdn.net/qq_37703224/article/details/142542179?spm1001.2014.3001.5501 安装的时候有个提示, 使用指定配置启动: /opt/homebrew/opt/redis/bin/redis-server /opt/homebrew/etc/redis.conf那么我们可以尝试修改这个配置文件: code /opt/homebrew/…

IDEA服务启动时无法输出日志

起服务时&#xff0c;控制台啥日志也没有 解决方案&#xff1a;选择【启用调试输出】 SQL的日志无法打印 原来安装了一个Mybatis Log Free&#xff0c;用的好好的。 后来换了个项目&#xff0c;SQL执行日志就打印不出来了。 解决方案&#xff1a;换个插件&#xff0c;我换了…

使用离火插件yoloV8数据标注,模型训练

1. 启动 2.相关配置 2.1 data.yaml path: D:/yolo-tool/yaunshen-yolov8/YOLOv8ys/YOLOv8-CUDA10.2/1/datasets/ceshi001 train: images val: images names: [蔡徐坤,篮球] 2.2 cfg.yaml # Ultralytics YOLOv8, GPL-3.0 license # Default training settings and hyp…

VS Code使用Git Bash终端

Git Bash可以运行linux命令&#xff0c;在VS Code的终端界面&#xff0c;找到号旁边的箭头&#xff0c;就能直接切换了 当然&#xff0c;前提是安装了Git Bash&#xff0c;并且在资源管理器里&#xff0c;能鼠标右键出"Git Bash Here"

C语言 | Leetcode C语言题解之第438题找到字符串中所有字母异位词

题目&#xff1a; 题解&#xff1a; /*** Note: The returned array must be malloced, assume caller calls free().*/ /* *int strCmpn&#xff1a;比较滑动窗口和字符串的相同值 char * s&#xff1a;字符串s&#xff0c;滑动窗口的位置 char * p&#xff1a;字符串p&#…

Python 课程21-Django

前言 在当今互联网时代&#xff0c;Web开发已成为一项必备技能。而Python作为一门简洁、高效的编程语言&#xff0c;其Web框架Django以其强大的功能和快速开发的特点&#xff0c;受到了广大开发者的青睐。如果你想深入学习Django&#xff0c;构建自己的Web应用&#xff0c;那么…

云中红队系列 | 使用 AWS API 配置Fireprox进行 IP轮换

在渗透测试评估期间&#xff0c;某些活动需要一定程度的自动化&#xff0c;例如从 LinkedIn 等网站抓取网页以收集可用于社会工程活动、密码喷洒登录门户或测试时盲注的有效员工姓名列表网络应用程序。但是&#xff0c;从单个源 IP 地址执行这些活动可能会导致在测试期间被拦截…

深度学习—神经网络基本概念

一&#xff0c;神经元 1.生物神经元与人工神经元 1.1神经元是人脑的基本结构和功能单位之一。人脑中有数1000亿个神经元&#xff0c;其功能是接受&#xff08;树突&#xff09;&#xff0c;整合&#xff08;细胞体&#xff09;&#xff0c;传导&#xff08;轴突&#xff09;和…

电脑usb接口封禁如何实现?5种禁用USB接口的方法分享!(第一种你GET了吗?)

“防患于未然&#xff0c;安全始于细节。”在信息技术飞速发展的今天&#xff0c;企业的信息安全问题日益凸显。 USB接口作为数据传输的重要通道&#xff0c;在带来便利的同时&#xff0c;也成为了数据泄露和安全风险的高发地。 因此&#xff0c;对电脑USB接口进行封闭管理&a…