HarmonyOS开发5.0【rcp网络请求】

news2024/11/25 20:39:34

一 概述

现在鸿蒙的网络还不成熟,所以咱们需要对网络请求框架二次封装,并且避免业务方直接引用到,预防当有比较新的成熟性价比高的框架的替换,这个过程肯定是不可避免的

1.1 第三方比如

  • [axios]的js库迁移过来的
  • [httpclient]通过socket,基于android中著名的 [okhttp]的代码写的

1.2 官方的

http和rcp的区别

  • [@ohos.net.http]暂不会再演进或新增其他功能
  • [rcp] 在接口易用性、性能、功耗方面比http网络库好,以后主推这个,但是也不确定后续是否还会出来第三套

二 [@ohos.request (上传下载)]

如果对上传和下载高度定制的,可以使用 [@ohos.request (上传下载)],如果不想有通知显示,可以mode: request.agent.Mode.FOREGROUND就可以关闭通知栏显示

二 rcp

同一个session ,没有请求限制,经过测试没有请求限制,一个App最多能创建16个session,再创建就会报错,所以我们整个APP需要两个session即可,一个是请求接口,一个是下载上传使用。

先说坑点

  • 坑1:downloadToFile 无法暂停,好像也符合设计,如果是大文件可以使用 [@ohos.request (上传下载)]mode: request.agent.Mode.FOREGROUND
  • 坑2:get请求,没有直接可以传递参数的,得咱们自己拼接到url上面

二次分装 HttpHelper,暂时不写接口隔离的方式了,

  • baseUrl

  • sessionHelper 主要提供session,一般上传下载的session 不能同时进行两个,因为回调无法分开,

  • headers 咱们请求的一些公共header

    • User-Agent: 提供关于客户端软件的信息,例如浏览器类型和版本

    • Accept: 客户端可接受的内容类型 ,例如 application/json

    • Accept-Encoding: 客户端可接受的编码方式,如gzip,br

    • Content-Type: 它告诉服务 如何解析和处理请求

        1. application/json 表示请求或响应体中的数据是 JSON 格式
        1. application/x-www-form-urlencoded 用于表单提交,表示数据以键值对的形式编码
        1. multipart/form-data 用于表单上传文件时,数据以多部分的形式发送,适合上传文件和其他数据
    • Cookie: 用于在客户端存储会话信息的一种方式

    • Authorization:用于提供身份验证信息,通常用于 API 访问

    • Connection: 如keep-alive ,指定连接的选项,例如是否保持连接

export class HttpHelper {
  baseUrl: string = '';
  sessionHelper = new SessionHelper();
  normalSession: rcp.Session = this.sessionHelper.createNormalSession();
  // User-Agent: 提供关于客户端软件的信息,例如浏览器类型和版本
  // Accept: 客户端可接受的内容类型 ,例如 application/json
  // Accept-Encoding: 客户端可接受的编码方式,如gzip,br

  // Content-Type: 它告诉服务 如何解析和处理请求
  //    1. application/json 表示请求或响应体中的数据是 JSON 格式
  //    2. application/x-www-form-urlencoded 用于表单提交,表示数据以键值对的形式编码
  //    3. multipart/form-data 用于表单上传文件时,数据以多部分的形式发送,适合上传文件和其他数据

  // Cookie: 用于在客户端存储会话信息的一种方式
  // Connection: 如keep-alive ,指定连接的选项,例如是否保持连接
  // Authorization:用于提供身份验证信息,通常用于 API 访问
  headers: rcp.RequestHeaders = {
    'authorization': 'token',
    'cookie': 'cookie',
    'user-agent': 'nzy手机',
    'accept': 'application/json',
    'content-type': 'application/x-www-form-urlencoded', // post时候使用 表单,告知服务器如何解析
    // 'content-type': 'application/json',// post的时候使用body
    // 'content-type': 'multipart/form-data'  // multipart
    'Connection': 'Keep-Alive',
    'accept-encoding': 'br,gzip', // 压缩方式
  };

  constructor(baseUrl: string) {
    this.baseUrl = baseUrl;
  }
}
BaseResponse

跟服务端商量好,比如errorCode=0是正常流程,其他是否需要showToast看业务需要,自己配置就好

ts
 代码解读
复制代码
export interface BaseResponse<T> {
  errorCode: number 
  errorMsg: string
  data: T
}
get请求T

get请求不要传递到RequestContent ,他会跑到body里面,我们只能自己拼接到

async get<T>(path: string, params?: Record<string, RequestMapValue>): Promise<T> {
  // get 就不要放到params里面了,否则跑到body里面了,直接拼接到后面
  let newUrl = this.baseUrl + path
  if (params) {
    newUrl += '?' + Object.keys(params)
      .map(k => `${k}=${params[k]}`)
      .join('&')
  }
  let req = new rcp.Request(newUrl, 'GET', this.headers);
  let response = await this.normalSession.fetch(req)
  if (response.statusCode == 200) {
    let responseBase: T = response.toJSON() as T
    // 成功了
    return responseBase
  } else {
    return Promise.reject({ code: response.statusCode, message: 'http非200' })
  }
}
get请求BaseResponse 非0 就让他走到异常里面

这里把data内容包装成泛型,有时候需要非0的时候 需要toast errorMessage,可以做对应的逻辑处理,使用方错误的时候有三种情况

  • http code码非200
  • errorCode 非 0 ,这是跟后端对的业务,是否需要toast errorMessage
  • 业务处理的时候,crash了,
async get<T>(path: string, params?: Record<string, RequestMapValue>): Promise<T> {
  // get 就不要放到params里面了,否则跑到body里面了,直接拼接到后面
  let newUrl = this.baseUrl + path
  if (params) {
    newUrl += '?' + Object.keys(params)
      .map(k => `${k}=${params[k]}`)
      .join('&')
  }
  let req = new rcp.Request(newUrl, 'GET', this.headers);
  let response = await this.normalSession.fetch(req)
  if (response.statusCode == 200) {
    let responseBase: T = response.toJSON() as T
    // 成功了
    return responseBase
  } else {
    return Promise.reject({ netStatus: NetStatus.httpError, code: response.statusCode, message: 'http非200' })
  }
}

业务调用的时候

http.getBase<HarmonyData>("/project/list/1/json", { "cid": 249 })
  .then((data) => {
    Logger.json(data, 'response')
    // 非 0 就过去了
    this.message = JSON.stringify(data, null, 2)
  })
  .catch((err: NetError) => {
    Logger.error(err);
    if (err.netStatus) {
      // 证明是 http 错误
      if (err.netStatus == NetStatus.businessError) {
        //是否需要toast message
        promptAction.showToast({ message: err.message })
      }
    } else {
      // 代表业务有异常 ,也就是then里面代码crash了
    }
  })

POST 请求

post 请求分为三类,

  • JSON数据,也就是body里面是JSON格式
  • Form表单格式 body里是这样的password=xxx&username=xxx
  • Multipart格式,一般是包括文件,比如上传头像
POST JSON

这里因为我们不知道具体会给多少层,所以用了 value是ESObject 格式

async post<T>(path: string, params?: Record<string, ESObject>): Promise<T> {
  // 变更header中的 content-type 为 Body 格式
  this.headers['content-type'] = 'application/json'
  let req = new rcp.Request(`${this.baseUrl}${path}`, 'POST', this.headers, params);
  let response = await this.normalSession.fetch(req)
  if (response.statusCode == 200) {
    let responseBase: T = response?.toJSON() as T
    // 成功了
    return responseBase
  } else {
    return Promise.reject({ netStatus: NetStatus.httpError, code: response.statusCode, message: 'http非200' })
  }

}
使用
http.post<BaseResponse<HarmonyData>>(
  "/user/login",
  {
    'username': 'nzyandroid',
    'password': 'nzyandroid',
    'content': {
      'name': 'nzy',
      'age': 18
    }
  })
  .then((data) => {
    Logger.json(data, 'response')
    this.message = JSON.stringify(data, null, 2)
  })
  .catch((err: BusinessError) => {
    Logger.error(err);
  })

1

POST 表单
async postForm<T>(path: string, params?: Record<string, RequestMapValue>): Promise<T> {
  // 变更header中的 content-type 为 表单格式
  this.headers['content-type'] = 'application/x-www-form-urlencoded'
  const form = new rcp.Form(params as rcp.FormFields)
  let req = new rcp.Request(`${this.baseUrl}${path}`, 'POST', this.headers, form);
  let response = await this.normalSession.fetch(req)
  if (response.statusCode == 200) {
    let responseBase: T = response?.toJSON() as T
    // 成功了
    return responseBase
  } else {
    return Promise.reject({ netStatus: NetStatus.httpError, code: response.statusCode, message: 'http非200' })
  }
}
使用
http.postForm<BaseResponse<HarmonyData>>(
  "/user/login",
  {
    'username': 'nzyandroid',
    "password": 'nzyandroid'
  })
  .then((data) => {
    Logger.json(data, 'response')
    this.message = JSON.stringify(data, null, 2)
  }).catch((err: BusinessError) => {
  Logger.error(`Response err: Code is ${err.code}, message is ${err.message}`);
})

2

POST Multipart
async postMultipartForm<T>(path: string, params?: Record<string, RequestMapValue | MultipartFormFile>): Promise<T> {
  // 变更header中的 content-type 为 表单格式
  this.headers['content-type'] = 'multipart/form-data'
  const form = new rcp.MultipartForm(params as rcp.MultipartFormFields)
  let req = new rcp.Request(`${this.baseUrl}${path}`, 'POST', this.headers, form);
  let response = await this.normalSession.fetch(req)
  if (response.statusCode == 200) {
    let responseBase: T = response?.toJSON() as T
    // 成功了
    return responseBase
  } else {
    return Promise.reject({ netStatus: NetStatus.httpError, code: response.statusCode, message: 'http非200' })
  }
}
使用
http.postMultipartForm<Object>(
  "/user/login",
  {
    'name': 'nzy',
    'file': {
      remoteFileName: 'img1.jpg',
      contentOrPath: getContext(this).cacheDir + '/' + 'img1.jpg'
    }
  })
  .then((data) => {
    Logger.json(data, 'response')
    this.message = JSON.stringify(data, null, 2)
  })
  .catch((err: BusinessError) => {
    Logger.error(`Response err: Code is ${err.code}, message is ${err.message}`);
  })

3

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

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

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

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

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

鸿蒙面经

2

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux s3c2440 开发板上的操作系统实现 ubuntu

使用s3c2440开发板 使用ubuntu 1.ubuntu中的tftp&#xff0c;和nfs Trivial File Transfer Protocol,简单文件 传输协议。 通过网络在客户端与服务器之间进行简单文件 传输。提供不复杂、开销不大的文件传输服务。 Network File System&#xff0c;网络文件系统。通过 网络…

OpenStack概论和部署

目录 1.1 云计算概述 1.1.1 什么是云计算 1.laaS 2.PaaS 3.Saas 1.1.2 0penStack 概述 1.OpenStack 起源 2.什么是 Openstack 3.OpenStack 优势 1.2 安装方式 1.2.1 在线安装 1.配置系统基本环境 2.为系统设置阿里的仓库 3&#xff1a;设置kvm源 4&#xff1a;设…

【HarmonyOS】头像圆形裁剪功能之手势放大缩小,平移,双击缩放控制(三)

【HarmonyOS】头像裁剪之手势放大缩小&#xff0c;平移&#xff0c;双击缩放控制&#xff08;三&#xff09; 一、DEMO效果图&#xff1a; 二、开发思路&#xff1a; 使用矩阵变换控制图片的放大缩小和平移形态。 通过监听点击手势TapGesture&#xff0c;缩放手势PinchGes…

安泰功率放大器在压电马达中的应用实例

压电马达是一种利用压电效应的装置&#xff0c;通过在压电陶瓷上施加电场&#xff0c;引发其形变从而产生机械振动。在这个领域&#xff0c;功率放大器的应用为提高效率、精准控制和创新性应用提供了可能。下面将深入介绍功率放大器在压电马达中的实际应用例子。 压电效应是指在…

三维数字图像相关法(3D-DIC)用于复合材料力学性能测试

三维数字图像相关法&#xff08;3D-DIC技术&#xff09;&#xff0c;通过将物体表面随机分布的斑点或伪随机分布的人工散斑场作为变形信息载体&#xff0c;是应用于计算机视觉技术的一种图像测量方法&#xff0c;是一种非接触的&#xff0c;用于全场三维坐标、位移、应变及运动…

微信双开及多开!

在工作中大家可能会在pc端用到一台机器打开多个微信&#xff0c;但是现在windows更新之后&#xff0c;双击就只能打开一个了&#xff0c;以下有两种方式可以微信双开甚至多开。 第一种就是很简单的&#xff1a; ps: taskkill /f /im wechat.exe 这一步的用途就是先清除你电脑…

北京链家星河湾店·鸿鹄向阳杯羽毛球赛成功举办

9月10日&#xff0c;为了提高社区居民身体素质&#xff0c;促进社区居民间友好交流&#xff0c;北京链家星河湾店联合鸿鹄向阳俱乐部于在四季体育馆联合举办了羽毛球大赛&#xff0c;星河湾的社区居民积极参加&#xff0c;分组合作&#xff0c;在比赛中表现出团结合作不服输的精…

AbMole总RNA提取试剂 (免氯仿) AbMole Easy Trizol (Tcm Free)

AbMole Easy Trizol (Tcm Free) 是传统Trizol 的免氯仿升级版&#xff0c;广泛适用于从各类动物组织、植物材料、培养细胞、细菌等样品中提取Total RNA和Small RNA。与传统 Trizol 提取方法相比&#xff0c;本产品不需要使用氯仿进行分层&#xff0c;操作更简单&#xff0c;且全…

视频倒放怎么制作?4种方法教你制作倒放视频

视频倒放怎么制作&#xff1f;视频倒放&#xff0c;作为一种独具匠心的编辑手法&#xff0c;为视频创作开辟了新的维度。它不仅让常规画面变得非比寻常&#xff0c;还能以逆向视角展现时间流逝的奇幻效果&#xff0c;极大地丰富了视频的表现力和趣味性&#xff0c;是扩充视频创…

降本、创新、合作,谁才是连接器行业破除内卷的关键词?

如果用一个字来评价2024年的汽车行业&#xff0c;那就是「卷」。 ▲中国汽车保有量不断提升 图/Pixabay 长安汽车董事长朱华荣说&#xff1a;“汽车行业的卷&#xff0c;让中国品牌达到了新高度。” 吉利董事长李书福说&#xff1a;“中国汽车工业内卷程度全球第一&#xff0c;…

C++运算符重载实现日期类

目录 运算符重载 日期类头文件time.h time.h 日期类成员函数文件time.cpp 1.GetMonthDay函数 2.构造函数Date::Date(int year, int month, int day) 3.赋值函数Date& operator(const Date& d) 4.Date& Date::operator(int day)函数实现日期加天数的功能 5.前置…

用编程思想解决问题

1.是什么 分解法&#xff1a;将复杂的问题分解为一个个小又容易的问题&#xff0c;再逐一解决 先常后变&#xff1a;先使用常量来解决问题后使用变量来代替常量&#xff0c;使代码变得更灵活 例题一&#xff1a; 请你使用Switch分支结构根据输入的分数来定成绩所在区间&…

若依 ruoyi-vue 获取上一页路由 获取返回上一页路径 登录后跳转其他页面 登录进入后跳转至动态路由的第一个路由

参考文章:若依框架登录后跳转其他页面&获取不同的菜单&登录进入后跳转至动态路由的第一个路由 需求&#xff1a;登录成功&#xff0c;默认跳转至后端返回的动态路由的第一个路由 src/store/modules/permission.js 将动态路由的第一个路由存到缓存中 import cache …

多人开发小程序设置体验版的痛点

抛出痛点 在分配任务时,我们将需求分为三个分支任务,分别由前端A、B、C负责: 前端A: HCC-111-实现登录功能前端B: HCC-112-实现用户注册前端C: HCC-113-实现用户删除 相应地,我们创建三个功能分支: feature_HCC-111-实现登录功能feature_HCC-112-实现用户注册feature_HCC-1…

新手向教学,分分钟搭建个人定制化的 ChatgptGPT 聊天机器人

对话机器人变得越来越流行&#xff0c;它为用户提供了与技术互动的方式。OpenAI 的“GPT”模型让开发者能够创建复杂的对话机器人。 在本教程中&#xff0c;我们将使用 Python 和 OpenAI API 在运行 Ubuntu 的 DigitalOcean Droplet 上构建并部署你自己的终端 ChatGPT 机器人。…

基于SpringBoot+Vue+MySQL的校园食堂订餐

系统展示 用户前台界面 管理员后台界面 系统背景 随着信息技术的飞速发展和互联网的普及&#xff0c;传统校园食堂的运作模式已难以满足现代学生日益增长的便捷性、个性化需求。学生们希望能够在忙碌的学习生活中&#xff0c;通过更加高效、便捷的方式完成就餐选择&#xff0c;…

【算法篇】数组类(笔记)

目录 一、二分查找 1. 方法一 2. 方法二 二、移除元素 1. 暴力破解 2. 双指针法 三、有序数组的平方 双指针法 四、长度最小的子数组 1. 暴力破解 2. 滑动窗口 五、螺旋矩阵 II 一、二分查找 704. 二分查找 - 力扣&#xff08;LeetCode&#xff09;https://leet…

深入理解Java虚拟机:Jvm总结-虚拟机字节码执行引擎

第八章 虚拟机字节码执行引擎 8.1 意义 不受物理条件制约地定制指令集与执行引擎的结构体系&#xff0c;能够执行那些不被硬件直接支持的指令集格式。输入的是字节码二进制流&#xff0c;处理过程是字节码解析执行的等效过程&#xff0c;输出的是执行结果 8.2 运行时栈帧结构…

jupyter出错ImportError: cannot import name ‘np_utils‘ from ‘keras.utils‘ ,怎么解决?

文章前言 此篇文章主要是记录一下我遇到的问题以及我是如何解决的&#xff0c;希望下次遇到类似问题可以很快解决。此外&#xff0c;也希望能帮助到大家。 遇到的问题 出错&#xff1a;ImportError: cannot import name np_utils from keras.utils &#xff0c;如图&#xf…

Metasploit Pro 4.22.3-2024081901 (Linux, Windows) - 专业渗透测试框架

Metasploit Pro 4.22.3-2024081901 (Linux, Windows) - 专业渗透测试框架 Rapid7 Penetration testing, release Aug 19, 2024 请访问原文链接&#xff1a;https://sysin.org/blog/metasploit-pro-4/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页…