当前位置: 首页 > news >正文

鸿蒙开发HarmonyOS Next 网络框架retrofit 封装 viemodel使用

新手刚开始学习harmonyos开发,之前搞安卓开发习惯使用retrofit,结果在三方库中还真搜到了,然后就模拟学习一下。有不对的地方请指点一下。新手新手

oh-package.json5 引入库

retofit 需要使用2.0.1-rc.0 以上版本,修复了retrofit发送网络请求,响应结果未正常解析的问题。

   "@ohos/retrofit": "2.0.1-rc.0","@ohos/httpclient": "2.0.1-rc.5",

页面使用

@Entry
@Component
struct LoginPage {@State viewModel: LoginViewModel = new LoginViewModel().....省略Button("登录").width("85%").height(50).margin({ top: 65 }).onClick(() => {if (StrUtil.isEmpty(this.viewModel.userName)) {ToastUtil.showToast("请输入用户名")return}if (StrUtil.isEmpty(this.viewModel.password)) {ToastUtil.showToast("请输入密码")return}this.viewModel.getToken()})}

viewmodel使用

@Observed
export class LoginViewModel {userName: string = ""password: string = "".....省略getToken() {let params = new Map<string, undefined>()params["username"] = this.userNameparams["password"] = this.passwordbaseApiRequest<Token>(appService.getToken(params),(result) => {Logger.debug("" + result.accessToken)},//可选参数,可不传{onFailed: (error) => {}, showLoading: true, loadingStr: "zzzzzzz"})}
}

定义接口

@BasePath("/")
export class AppService extends BaseService {@GET("szy/uaa/oauth/token")async getToken(@QueryMap params: Map<string, undefined>): Promise<Response<ApiResponse<Token>>> {return {} as Response<ApiResponse<Token>>}
}

httpclient 拦截器

export class LoggingInterceptor implements Interceptor {async intercept(chain: Chain): Promise<Response> {try {let request = chain.requestI()let requestBody: RequestBody = request.bodylet url = request.url as HttpUrlconst connectResponse = await chain.proceedI(chain.requestI())let startMessage = `-->${request.method} ${url.url} ${connectResponse.protocol ?? ''}`let contentType: string = requestBody.contentlet endMessage = `--> END ${request.method}`LoggerUtils.debug("添加日志拦截器")LoggerUtils.debug(`Headers:${JSON.stringify(request.headers)}`)LoggerUtils.debug("httpStart = " + startMessage)LoggerUtils.debug("contentType = " + contentType)LoggerUtils.debug("Response = " + connectResponse.result)LoggerUtils.debug("httpEnd = " + endMessage)return connectResponse} catch (error) {LoggerUtils.debug("添加日志拦截器 失败")return new Promise<Response>((resolve, reject) => {let request = chain.requestI()let response = chain.proceedI(request)response.then((data) => {resolve(data)}).catch((err: Error) => {reject(err)});})}}
}

RetrofitApi.ets简单封装

import { HttpClient, IOException, TimeUnit } from '@ohos/httpclient'
import { Response, ServiceBuilder } from '@ohos/retrofit'
import { ToastUtil } from '@pura/harmony-utils'
import { NetworkConstants } from '../../common/NetworkConstants'
import { ApiResponse } from './ApiResponse'
import { AppService } from './AppService'
import { HeaderInterceptor } from './HeaderInterceptor'
import { LoggingInterceptor } from './LoggingInterceptor'
import { DialogUtils } from '../../common/DialogUtils'let client: HttpClient = new  HttpClient.Builder().setConnectTimeout(15, TimeUnit.SECONDS).setReadTimeout(15, TimeUnit.SECONDS).addInterceptor(new LoggingInterceptor()).addInterceptor(new HeaderInterceptor()).build()export const appService = new ServiceBuilder().setEndpoint(NetworkConstants.BASE_URL).setClient(client).build(AppService)/*** 可选参数*/
interface ApiParams {onFailed?: (error: ResourceStr) => void,showLoading?: boolean,loadingStr?: string
}export function baseApiRequest<T>(apiCall: Promise<Response<ApiResponse<T>>>,onSuccess: (result: T) => void,param?: ApiParams,
) {if (param?.showLoading) {DialogUtils.showLoading(param.loadingStr)}apiCall.then((result: Response<ApiResponse<T>>) => {if (result.isSuccessful() && result.code() == 200 && result.result.success) {onSuccess(result.result.data)} else {ToastUtil.showToast(result.result.message)if (param?.onFailed) {param.onFailed(result.result.message)}}DialogUtils.dismiss()}).catch((error: Error) => {if (error as IOException) {if (param?.onFailed) {param.onFailed('error = ' + error)}} else {if (param?.onFailed) {param.onFailed(error.message)}}ToastUtil.showToast(error.message)DialogUtils.dismiss()})
}

http://www.lryc.cn/news/369588.html

相关文章:

  • 什么是SpringMVC
  • 【PowerDesigner】PDM生成建表脚本
  • React实现在线预览word报告/本地选择报告预览
  • 计算机哈佛架构、冯·诺依曼架构对比
  • 单片机串口发送为空中断和发送完成中断有什么区别?
  • css特效:对多个tag标签实现模拟地球仪特效
  • 【2024Python教程】Python文件打包成exe,如果有图片怎么打包?有手就会的超简单教程
  • mac环境基于llama3和metaGPT自动开发2048游戏
  • 这些Linux知识可不是靠背就会的!
  • openlayers 绘图功能,绘制多边形,draw组件的使用,一个简单的需求引发的思考(一)
  • 【Flutter】 TextField限制长度时, 第三方手写输入法、ios原始拼音输入法输入被吞问题
  • 快递一键查询,只需快递单号,轻松掌握全程物流信息,让您的包裹追踪无忧!
  • 【Java探索之旅】继承结构 继承和组合 protected final
  • Ubuntu20.04-SLAM软件安装
  • OSI七层网络参考模型
  • RAG与知识库搭建
  • MySQL提权之UDF提权
  • 【设计模式】结构型设计模式之 组合模式
  • 我给KTV服务生讲解防抖,他竟然听懂了
  • 抽象java入门1.3.1
  • 使用Rufus工具制作Ubuntu To Go——很详细
  • Android Jetpack Compose 实现一个电视剧选集界面
  • C++多线程并发
  • 新火种AI|摊上事儿了!13名OpenAI与谷歌员工联合发声:AI失控可能导致人类灭绝...
  • Web前端后端精通:深度解析与技能进阶
  • 【C语言】09.函数递归
  • php高级之框架源码、宏扩展原理与开发
  • (2024,示例记忆,模型记忆,遗忘,差分评估,概率评估)深度学习中的记忆:综述
  • 硬件产品经理
  • AES加密、解密工具类