鸿蒙学习笔记二十一:网络框架

最近对鸿蒙项目中的网络框架进行了整理,拆分出一个单独的网络模块
具体用法如下:
1:在业务模块中添加对网络模块的依赖

找到业务模块中的oh-package.json5文件,在dependencies中添加,示例如下:

{
  "name": "usercenter",
  "version": "1.0.0",
  "description": "Please describe the basic information.",
  "main": "Index.ets",
  "author": "",
  "license": "Apache-2.0",
  "dependencies": {
    "netWork": "file:../../Common/netWork"
  }
}
2:添加上之后,点击 Sync Now按钮,同步代码,代码同步完成后即可引用网络库
image.png
3:使用示例

在网络库中我写了一个示例页面:NetTestPage和TestViewModel,用于展示具体的网络请求调用方法,需要注意的是如果需要监控当前接口请求的状态,则需要使用this.httpRequest().promise()来包裹接口调用的方法——对应为TestViewModel中的getSearchResult(),如果无需监控则直接调用网络请求即可——对应为TestViewModel中的getSearchResultViewModel()

import { ViewStateConstant } from '../constant/ViewStateConstant'
import { TestViewModel } from '../businessViewModel/TestViewModel'
import { CommonDataSource } from '../viewmodels/CommonDataSource'


@Component
export struct NetTestPage {
  @State commonDataSource: CommonDataSource<string> = new CommonDataSource([])
  @State viewState: string = ViewStateConstant.VIEW_STATE_LOADING //展示骨架屏
  private testViewModel: TestViewModel = new TestViewModel(this.commonDataSource)

  aboutToAppear() {
    this.testViewModel.observeState((state) => {
      this.viewState = state
    })

    this.testViewModel.getSearchResult("测试", 1, () => {
      //接口调用结束
    })
  }

  build() {
    RelativeContainer() {
      this.normalContent()

      if (this.viewState == ViewStateConstant.VIEW_STATE_LOADING) {
        this.loadingContent()
      }
    }
    .width('100%')
    .height('100%')
  }

  //接口成功后的UI
  @Builder
  private normalContent() {

  }

  //接口加载中的UI,可以展示加载框或者骨架屏
  @Builder
  private loadingContent() {

  }
}
import { ApiService } from '../../../../Index'
import { BaseViewModel } from '../viewmodels/BaseViewModel'
import { CommonDataSource } from '../viewmodels/CommonDataSource';
import { SearchResultData } from './SearchResultData'

export class TestViewModel extends BaseViewModel {
  //注意:这里有getSearchResult()和getSearchResultViewModel()两个方法
  //区别点在于getSearchResult()可以同步获取当前网络请求的状态,比如加载中
  //getSearchResultViewModel()不会同步网络请求的状态

  testList: CommonDataSource<string>

  constructor(testList: CommonDataSource<string>) {
    super();
    this.testList = testList
  }

  async getSearchResult(searchText: string, currPage: number, onFinish: () => void) {
    await this.httpRequest().promise(this.getSearchResultViewModel1(searchText, currPage, onFinish))
  }

  //注意:这里的ApiService需要导入index中的,因为真实业务中网络框架肯定不会和业务放在同一模块中的
  //示例:获取搜索结果列表
  getSearchResultViewModel1(searchText: string, currPage: number, onFinish: () => void) {
    return ApiService.get<SearchResultData>({
      url: 'www.baidu.com', //接口地址——不包含Host的公共部分,公共部分在GlobalConfig中配置
      params: {
        searchContent: `${searchText}`, //搜索时用到
        page: currPage,
      }
    })
      .then((result: SearchResultData) => {
        //获取数据成功
        if (result.list) {
          this.testList.addDatas(0,result.list)
        }
      })
      .finally(() => {
        //接口调用结束
        onFinish()
      })
  }

  //get请求:参数以path的形式放到接口地址中
  getSearchResultViewModel2(searchText: string): Promise<string> {
    return ApiService.get<string>({
      url: `www.baodu.com/{searchText}/list`.replace('{searchText}',
        searchText),
      params: {
        userType: searchText
      }
    })
  }

  //post请求:使用表单传参
  postSearchResultViewModel1(currPage: string, onFinish: () => void) {
    return ApiService.post<Array<string>>({
      url: 'www.baidu.com', //接口地址——不包含Host的公共部分,公共部分在GlobalConfig中配置
      data: {
        currPage: `${currPage}`
      }
    })
      .then((result: Array<string>) => {

      })
      .finally(() => {
        onFinish()
      })
  }

  //post请求,不使用表单传参
  postSearchResultViewModel2(currPage: string): Promise<boolean> {
    return ApiService.post<boolean>({
      url: 'www.baidu.com', //接口地址——不包含Host的公共部分,公共部分在GlobalConfig中配置
      isFormUrlEncoded: false, //不使用表单传参
      data: {
        currPage: `${currPage}`
    }
    })
      .then((result: boolean) => {
        return result
    })
  }
}

4:在GlobalConfig中配置接口基地址

export class GlobalConfig {
  static readonly APP_NAME = "APP的名称" //刷新token时用到,如果无需刷新token则可删除
  static readonly HTTPS = "https://"
  static SCHEMA = GlobalConfig.HTTPS
  static HOST = GlobalConfig.SCHEMA + "接口的公共部分"; //配置接口的公共部分
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
禁止转载,如需转载请通过简信或评论联系作者。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,458评论 6 513
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,030评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,879评论 0 358
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,278评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,296评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,019评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,633评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,541评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,068评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,181评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,318评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,991评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,670评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,183评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,302评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,655评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,327评论 2 358

推荐阅读更多精彩内容