HarmonyOS NEXT应用开发实战(二、封装比UniApp和小程序更简单好用的网络库)

网络访问接口,使用频次最高。之前习惯了uniapp下的网络接口风格,使用起来贼简单方便。转战到鸿蒙上后,原始网络接口写着真累啊!目标让鸿蒙上网络接口使用,简单程度比肩uniapp,比Axios更轻量级。源码量也不多,但更方便定制优化,功能也不弱。

前言

接上篇,HarmonyOS NEXT应用开发(一、打造最好用的网络通信模块组件)-CSDN博客​​​​​​网络库已经封装好啦,成功发布到了OpenHarmony三方库中心仓。地址:OpenHarmony三方库中心仓

但是现在还没人气,可能一些伙伴不会用。这里特写了篇文章和使用demo,发出来让大家看下,原来写网络接口竟可以如此简单。

有多简单?demo源码地址:zhihudaily: HarmonyOS NEXT 项目开发实战,仿知乎日报的实现

看以下接口示例:

首先项目中先引入我发布到鸿蒙中心仓库的h_request网络库:

bash 复制代码
"dependencies": {
    "@yyz116/h_request": "1.0.1"
  }

以下home.ts的首页相关的api接口中,两行代码就写好了两个接口,够简单清晰吧。一个是获取影视轮播图的get接口,一个是获取影视数据的post接口请求。

TypeScript 复制代码
//main/ets/common/api/home.ts
import { setRequestConfig } from '../../utils/http';
import { BaseResponse,SwiperData,HotMovieReq,MovieRespData } from '../bean/ApiTypes';

// 调用setRequestConfig函数进行请求配置
setRequestConfig();

const http = globalThis.$http;

// 获取轮播图api接口
export const getSwiperList = (): Promise<BaseResponse<SwiperData>> => http.get('/swiperdata');

// 获取热门影视接口
export const getHotMovie = (req:HotMovieReq): Promise<BaseResponse<MovieRespData>> => http.post('/hotmovie',req);

详细示例

接口实现

准备两个后台接口:

bash 复制代码
### 1.首页,影视轮播图
get http://175.178.126.10:8000/api/v1/swiperdata

### 2.首页,正在热映的电影
post http://175.178.126.10:8000/api/v1/hotmovie
Content-Type:application/json
 
{
    "start": 0,
    "count": 1,
    "city": "郑州"
}

在项目工程源码ets/main/common/bean/目录下,创建网络通信json包协议的type定义:

TypeScript 复制代码
//file:ApiTypes.ts
export interface BaseResponse<T>{
  status: number;
  statusText:string;
  data:T;
}

export interface ErrorResponse {
  code: number;
  message: string;
  data: [];
}

// 轮播图响应数据
export interface SwiperItem{
  id:string;
  imageUrl:string;
  title:string;
  url:string;
  description:string;
}
export interface SwiperData {
  code: number;
  message: string;
  data: Array<SwiperItem>;
}

// 热门影视请求数据
export interface HotMovieReq {
  start: number;
  count: number;
  city:string;
}
// 热门影视响应数据
interface MovieItem{
  id:string;
  cover:string;
  title:string;
  gener:string;
  rate:number;
}
export interface MovieRespData {
  code: number;
  message: string;
  data: Array<MovieItem>;
  count: number;
  start: number;
  total: number;
  title: string;
}

创建个utils文件夹,放置封装的http.ts工具类,这个主要用来配置全局后台服务地址,参数和设置全局拦截器,并把其网络请求实例挂载在ArkTS引擎实例内部的一个全局对象globalThis中,供全局使用。

TypeScript 复制代码
import Request, { HttpRequestConfig, HttpResponse } from '@yyz116/h_request'
import { Log } from './logutil';
const $u = {
  http: new Request(),
}
//挂载在ArkTS引擎实例内部的一个全局对象globalThis中,供全局使用
globalThis.$http = $u.http;

export const setRequestConfig = () => {
  globalThis.$http.setConfig((config:HttpRequestConfig) => {
    config.baseURL = "http://175.178.126.10:8000/api/v1";
    return config;
  });
  // 请求拦截
  globalThis.$http.interceptors.request.use(
    (config) => {
      Log.debug('请求拦截')
      return config
    },
    (error) => {
      return Promise.reject(error)
    }
  )
  // 响应拦截
  globalThis.$http.interceptors.response.use(
    (response:HttpResponse) => {
      Log.debug('响应拦截')
      if (response.data.code == 401) {
        // 提示重新登录
        console.log('请登录')
        setTimeout(() => {
          console.log('请请登录')
        }, 1000);
      }
      return response
    },
    (error) => {
      return Promise.reject(error)
    }
  )
}

接下来就是写接口啦,以下示例一个是get接口使用,一个是post接口使用,且带post的数据。

TypeScript 复制代码
import { setRequestConfig } from '../../utils/http';
import { BaseResponse,SwiperData,HotMovieReq,MovieRespData } from '../bean/ApiTypes';

// 调用setRequestConfig函数进行请求配置
setRequestConfig();

const http = globalThis.$http;

// 获取轮播图api接口
export const getSwiperList = (): Promise<BaseResponse<SwiperData>> => http.get('/swiperdata');

// 获取热门影视接口
export const getHotMovie = (req:HotMovieReq): Promise<BaseResponse<MovieRespData>> => http.post('/hotmovie',req);

如果get的接口,带参数呢?带参数的话可以这样写:

TypeScript 复制代码
// 发送get请求,带参数,实际请求为:xxx.xxx/api/v1/musicsearchlrc?id=""&kind=""
http.get('api/v1/musicsearchlrc', {params:{id:"543656129",kind:"wy"}}).then((res:HttpResponse<Result>) => {
              hilog.debug(0x0000,"request",res.data.message)
              hilog.debug(0x0000,"request","res.data.code:%{public}d",res.data.code)
            }).catch((err:HttpResponse<Error>) => {
              hilog.debug(0x0000,"request","err.data.code:%d",err.data.code)
              hilog.debug(0x0000,"request",err.data.message)
            });
          })

如何使用

接下来就可以在页面中愉快的使用接口啦,可以看到使用变得十分简单。示例如下:

TypeScript 复制代码
import {getSwiperList,getHotMovie} from "../common/api/home"
import { hilog } from '@kit.PerformanceAnalysisKit';
import { ErrorResponse } from '../common/bean/ApiTypes';

@Entry
@Component
struct Index {
  @State message: string = 'Hello World';
  // 只有被@Entry装饰的组件才可以调用页面的生命周期
  onPageShow() {
    console.info('Index onPageShow');
  }
  // 只有被@Entry装饰的组件才可以调用页面的生命周期
  onPageHide() {
    console.info('Index onPageHide');
  }

  // 只有被@Entry装饰的组件才可以调用页面的生命周期
  onBackPress() {
    console.info('Index onBackPress');
  }

  // 组件生命周期
  aboutToAppear() {
    console.info('MyComponent aboutToAppear');
  }

  // 组件生命周期
  aboutToDisappear() {
    console.info('MyComponent aboutToDisappear');
  }

  build() {
    Row() {
      Column() {
        Text(this.message)
          .id('HelloWorld')
          .fontSize(50)
          .fontWeight(FontWeight.Bold)

        Button('test')
          .onClick(() => {
            console.info('button click');
            getSwiperList().then((res) => {
              hilog.debug(0x0000,"request",res.data.message)
              hilog.debug(0x0000,"request","res.data.code:%{public}d",res.data.code)
              hilog.debug(0x0000,"request","res.data.data[0]:%{public}s",res.data.data[0].id)
              hilog.debug(0x0000,"request","res.data.data[0]:%{public}s",res.data.data[0].imageUrl)
              hilog.debug(0x0000,"request","res.data.data[0]:%{public}s",res.data.data[0].title)
            }).catch((err:ErrorResponse) => {
              hilog.debug(0x0000,"request","err.data.code:%d",err.code)
              hilog.debug(0x0000,"request",err.message)
            });

            getHotMovie({start:0,count:1,city:"郑州"}).then((res) => {
              hilog.debug(0x0000,"request",res.data.message)
              hilog.debug(0x0000,"request","res.data.code:%{public}d",res.data.code)
              hilog.debug(0x0000,"request","res.data.data[0]:%{public}s",res.data.data[0].id)
              hilog.debug(0x0000,"request","res.data.data[0]:%{public}s",res.data.data[0].gener)
              hilog.debug(0x0000,"request","res.data.data[0]:%{public}s",res.data.data[0].title)
            }).catch((err:ErrorResponse) => {
              hilog.debug(0x0000,"request","err.data.code:%d",err.code)
              hilog.debug(0x0000,"request",err.message)
            });
          })
      }
      .height('100%')
      .width('100%')
    }
  }
}

总结

以上就是笔者封装的鸿蒙开源库h_request的使用介绍。可以看出使用此网络封装库后,在鸿蒙的网络服务开发上,也可以体验到如uniapp小程序开发般的简单易用。分享给有需要的小伙伴,欢迎留言评论并提宝贵意见,最终打造出一个在鸿蒙平台上最简单好用的网络库。

写在最后

最后,推荐下笔者的业余开源app影视项目"爱影家",推荐分享给与我一样喜欢观影的朋友。

开源地址: 爱影家app开源项目介绍及源码

https://gitee.com/yyz116/imovie
相关推荐
初遇你时动了情1 小时前
uniapp 城市选择插件
开发语言·javascript·uni-app
licy__1 小时前
微信小程序登录注册页面设计(小程序项目)
微信小程序·小程序
zhangjr05752 小时前
【HarmonyOS Next】鸿蒙实用装饰器一览(一)
前端·harmonyos·arkts
小小黑0074 小时前
uniapp+vue3+ts H5端使用Quill富文本插件以及解决上传图片反显的问题
uni-app·vue
草字4 小时前
uniapp input限制输入负数,以及保留小数点两位.
java·前端·uni-app
前端小胡兔5 小时前
uniapp rpx兼容平板
uni-app
荔枝吖5 小时前
uniapp实现开发遇到过的问题(持续更新中....)
uni-app
艾小逗5 小时前
uniapp将图片url转换成base64支持app和h5
uni-app·base64·imagetobase64
halo14167 小时前
uni-app 界面TabBar中间大图标设置的两种方法
开发语言·javascript·uni-app
诗歌难吟4649 小时前
初识ArkUI
harmonyos