华为《HarmonyOS第一课》“从网络获取数据 ”代码示例中的本机服务器设置

这是华为关于HarmonyOS开发系列课程中的一课,需要构建一个本地新闻服务端,然后开发客户端去访问并获得数据。
关于如何构建服务端,程序代码的README中介绍的比较简短,测试时需要构建局域网环境:测试本Codelab时要确保运行服务端代码的电脑和测试机连接的是同一局域网下的网络,您可以用您的手机开一个个人热点,然后将测试机和运行服务端代码的电脑都连接您的手机热点进行测试。
这种方式比较麻烦,实际上调试代码时,大多时候是通过模拟器来实现,并不需要通过手机实机开热点。下面是简短步骤。

一、启动服务端

在windows11系统下,假设已经安装好了node.js:

PS E:\MyCode\harmony\Lesson\NewsData\HttpServerOfNews> node -v
v22.5.1

直接运行npm,会报错,应该是由于powershell的权限设置问题:

PS E:\MyCode\harmony\Lesson\NewsData\HttpServerOfNews> npm
npm : 无法加载文件 C:\Program Files\nodejs\npm.ps1,因为在此系统上禁止运行脚本。有关详细信息,请参阅 https:/go.microsof
t.com/fwlink/?LinkID=135170 中的 about_Execution_Policies。
所在位置 行:1 字符: 1
+ npm
+ ~~~
    + CategoryInfo          : SecurityError: (:) [],PSSecurityException
    + FullyQualifiedErrorId : UnauthorizedAccess

如果不想改变powershell的设置,可以运行npm.cmd。

PS E:\MyCode\harmony\Lesson\NewsData\HttpServerOfNews> npm.cmd -v
10.8.2

接下来,按照README的内容,先安装依赖:

PS E:\MyCode\harmony\Lesson\NewsData\HttpServerOfNews> npm.cmd install
npm warn deprecated transformers@2.1.0: Deprecated, use jstransformer
npm warn deprecated constantinople@3.0.2: Please update to at least constantinople 3.1.1
npm warn deprecated jade@1.11.0: Jade has been renamed to pug, please install the latest version of pug instead of jade

added 112 packages, and audited 113 packages in 9s

2 packages are looking for funding
  run `npm fund` for details

8 vulnerabilities (1 low, 4 high, 3 critical)

To address all issues (including breaking changes), run:
  npm audit fix --force

Run `npm audit` for details.

报了一堆警告,不用理会。接着启动服务端:

PS E:\MyCode\harmony\Lesson\NewsData\HttpServerOfNews> npm.cmd start

> httpserverofnews@0.0.0 start
> node ./bin/www

服务器启动成功!

二、在模拟器访问

我们先在本机测试,本机可以通过访问127.0.0.1:9588得到数据(这里是在powershell命令行中进行测试,也可以使用浏览器)。

PS E:\MyCode\harmony\Lesson\NewsData\HttpServerOfNews> Invoke-WebRequest -Uri "http://127.0.0.1:9588/news/getNewsType"

StatusCode        : 200
StatusDescription : OK
Content           : {"code":"success","data":[{"id":0,"name":"全部"},{"id":1,"name":"国内"},{"id":2,"name":"国际"},{"id
                    ":3,"name":"娱乐"},{"id":4,"name":"军事"},{"id":5,"name":"体育"},{"id":6,"name":"科技"},{"id":7,"na
                    me":"财经"}],"msg"...
RawContent        : HTTP/1.1 200 OK
                    Connection: keep-alive
                    Keep-Alive: timeout=5
                    Content-Length: 236
                    Content-Type: application/json; charset=utf-8
                    Date: Mon, 05 Aug 2024 05:20:12 GMT
                    ETag: W/"ec-IWrH4kPiDT9Yt3VVy/7...
Forms             : {}
Headers           : {[Connection, keep-alive], [Keep-Alive, timeout=5], [Content-Length, 236], [Content-Type, applicati
                    on/json; charset=utf-8]...}
Images            : {}
InputFields       : {}
Links             : {}
ParsedHtml        : mshtml.HTMLDocumentClass
RawContentLength  : 236

但在模拟器中直接访问127.0.0.1是不行的,这个地址代表模拟器本身,而不是我们服务端所在的本机。经查看HarmonyOS文档,模拟器与本机位于一个局域网,必须访问本机的局域网ip,这里是192.168.1.4:9558。将这个地址写入CommonConstants.ts中:

  /**
   * The host address of the server.
   */
  static readonly SERVER: string = 'http://192.168.1.4:9588'

代码成功在模拟器运行起来并获得服务器的数据!(模拟器的wifi不用开,默认就和本机在一个局域网内)

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注