HarmonyOS NEXT开发进阶(二十):纯血鸿蒙应用(HarmonyOS NEXT)在尝试解析域名时失败问题修复

文章目录

    • 一、问题描述
    • [二、 原因分析及解决方案](#二、 原因分析及解决方案)
      • [2.1 检查网络权限配置](#2.1 检查网络权限配置)
      • [2.2 网络安全配置(针对HTTP/HTTPS)](#2.2 网络安全配置(针对HTTP/HTTPS))
        • [2.2.1 创建网络安全配置文件](#2.2.1 创建网络安全配置文件)
        • [2.2.2 在 module.json5 中引用](#2.2.2 在 module.json5 中引用)
    • [三、代码示例 - 正确的网络请求方式](#三、代码示例 - 正确的网络请求方式)
    • 四、DNS解析问题排查
    • 五、常见问题解决
      • [5.1 仅使用HTTP未配置明文传输](#5.1 仅使用HTTP未配置明文传输)
      • [5.2 域名拼写错误或不可达](#5.2 域名拼写错误或不可达)
      • [5.3 系统DNS问题](#5.3 系统DNS问题)
    • 六、完整的网络工具类示例
    • 七、配置建议

一、问题描述

纯血鸿蒙应用(HarmonyOS NEXT)实际运行过程中,在尝试解析域名时失败,提示"couldn't resolve host name"。具体错误信息如下:

bash 复制代码
 获取网络请求异常结果Error:{"type":2,"cause":{"code":1007900006,"data":"Couldn't resolve host name","extendInfo":{"httpPhase":"100000","dnsDur":"0.00","tcpDur":"0.00","tlsDur":"0.00","sndDur":"0.00","rcvDur":"0.00","totDur":"2092.88","redDur":"0.00","sptIP6":"1","proxyType":"none","sock":"-1","dnsRecvE":"11","tryDns":"2.0.*.**,a00:35::****:**:****:*,a00:35::****:***:****:***,2.0.*.**","connDns":"1,1,1,1","recvDns":"2.0.*.**,2.0.*.**,a00:35::****:***:****:***,a00:35::****:***:****:***,a00:35::****:***:****:***,a00:35::****:***:****:***,2.0.*.**,2.0.*.**"}}}
01-18 13:38:55.833   56767-56767   A03D00/..s.phone/JSAPP    I     ---->获取网络请求结果:msgcde=====:ER_0001;rtnmsg===服务异常,请稍后重试

二、 原因分析及解决方案

可能的原因如下:

  1. 网络权限问题:应用可能没有获取网络权限。
  2. 域名解析失败:设备DNS解析问题,或者域名不正确。
  3. 网络请求配置问题:在HarmonyOS中,使用网络请求需要正确配置。

步骤检查:

  1. 确保在模块的module.json5文件中配置了网络权限。
  2. 检查设备网络连接是否正常。
  3. 检查请求的域名是否正确,以及服务器是否可访问。
  4. 如果是使用了HTTP请求,注意HarmonyOS默认仅支持HTTPS,如果需要使用HTTP,需要在配置中明确允许。

2.1 检查网络权限配置

module.json5 中配置:

json 复制代码
{
  "module": {
    "requestPermissions": [
      {
        "name": "ohos.permission.INTERNET"
      },
      {
        "name": "ohos.permission.GET_NETWORK_INFO"
      }
    ]
  }
}

2.2 网络安全配置(针对HTTP/HTTPS)

2.2.1 创建网络安全配置文件

resources/base/profile/ 下创建 network_security_config.xml,配置内容如下,用于允许所有HTTP请求:

xml 复制代码
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
  <base-config cleartextTrafficPermitted="true">
    <trust-anchors>
      <certificates src="system" />
      <!-- 如果需要信任自定义证书 -->
      <certificates src="user" />
    </trust-anchors>
  </base-config>
  
  <!-- 或针对特定域名配置 -->
  <domain-config cleartextTrafficPermitted="true">
    <domain includeSubdomains="true">yourdomain.com</domain>
  </domain-config>
</network-security-config>

注意⚠️:允许HTTP仅用于测试,上架应用建议使用HTTPS。

2.2.2 在 module.json5 中引用
json 复制代码
{
  "module": {
    "metadata": [
      {
        "name": "ohos.network.security.policy",
        "resource": "$profile:network_security_config"
      }
    ]
  }
}

三、代码示例 - 正确的网络请求方式

使用 @ohos.net.http 模块

typescript 复制代码
import http from '@ohos.net.http';
import { BusinessError } from '@ohos.base';

// 创建HTTP请求
let httpRequest = http.createHttp();

// 请求选项
let options: http.HttpRequestOptions = {
  method: http.RequestMethod.GET,
  connectTimeout: 60000,
  readTimeout: 60000,
  header: {
    'Content-Type': 'application/json'
  }
};

// 执行请求
try {
  let response = await httpRequest.request(
    'https://api.example.com/data',
    options
  );
  
  console.log('Response:', response.result);
} catch (error) {
  let err: BusinessError = error as BusinessError;
  console.error('Request failed:', err.code, err.message);
  
  // 具体错误处理
  switch (err.code) {
    case 13900002: // 域名解析失败
      console.error('DNS解析失败,请检查网络或域名');
      break;
    case 13900005: // 连接超时
      console.error('连接超时');
      break;
  }
} finally {
  httpRequest.destroy();
}

四、DNS解析问题排查

添加网络状态监听

typescript 复制代码
import connection from '@ohos.net.connection';

// 检查网络状态
let netHandle = connection.getDefaultNet();
netHandle.getAddressesByName('api.example.com', (error, data) => {
  if (error) {
    console.error('DNS解析失败:', error);
  } else {
    console.log('解析到的IP:', data);
  }
});

如果是域名解析失败,可以尝试使用IP地址进行请求,以判断是否是域名解析问题。

如果使用IP地址可以请求成功,极有可能是DNS解析问题,可以尝试更换设备的DNS服务器(如8.8.8.8)或检查域名解析是否正确。

五、常见问题解决

5.1 仅使用HTTP未配置明文传输

解决 :如上配置 cleartextTrafficPermitted="true" 或切换为HTTPS

5.2 域名拼写错误或不可达

解决

typescript 复制代码
// 测试域名可达性
let url = 'https://api.example.com';
let hostname = new URL(url).hostname;

// 使用ping测试(如果有权限)
import ping from '@ohos.net.ping';
ping.ping(hostname, { timeout: 5000 }, (error, data) => {
  if (error) {
    console.error('Ping失败:', error);
  }
});

5.3 系统DNS问题

解决:尝试使用IP地址直接访问:

typescript 复制代码
// 临时使用IP测试
let ipUrl = 'https://192.168.1.100/api';
// 注意:HTTPS使用IP需要证书支持IP地址

六、完整的网络工具类示例

typescript 复制代码
import http from '@ohos.net.http';
import connection from '@ohos.net.connection';
import { BusinessError } from '@ohos.base';

export class NetworkUtils {
  
  // 检查网络连接
  static async checkNetwork(): Promise<boolean> {
    try {
      let netHandle = connection.getDefaultNet();
      let netCapabilities = await netHandle.getNetCapabilities();
      return netCapabilities.hasCapability(connection.NET_CAPABILITY_INTERNET);
    } catch (error) {
      return false;
    }
  }
  
  // 解析域名
  static async resolveHostname(hostname: string): Promise<string[]> {
    return new Promise((resolve, reject) => {
      let netHandle = connection.getDefaultNet();
      netHandle.getAddressesByName(hostname, (error: BusinessError, data: Array<string>) => {
        if (error) {
          reject(error);
        } else {
          resolve(data);
        }
      });
    });
  }
  
  // 发起请求(带重试机制)
  static async requestWithRetry(
    url: string, 
    options: http.HttpRequestOptions, 
    retries: number = 3
  ): Promise<any> {
    for (let i = 0; i < retries; i++) {
      try {
        let httpRequest = http.createHttp();
        let response = await httpRequest.request(url, options);
        httpRequest.destroy();
        return response;
      } catch (error) {
        if (i === retries - 1) {
          throw error;
        }
        // 等待后重试
        await new Promise(resolve => setTimeout(resolve, 1000 * (i + 1)));
      }
    }
  }
}

七、配置建议

  1. 开发阶段 :在 hvigorfile.ts 中确认网络权限已正确配置
  2. 真机调试:检查设备的网络设置,确认可以正常访问互联网
  3. 模拟器调试:确保模拟器网络连接正常
  4. 域名验证 :使用 nslookupping 命令验证域名可解析

如果以上方案均无效,请提供:

  1. 完整的错误堆栈信息
  2. 应用配置文件内容
  3. 运行环境(模拟器/真机)
  4. 访问的具体域名
相关推荐
小白阿龙2 小时前
鸿蒙+flutter 跨平台开发——决策工具的开发实现
flutter·华为·harmonyos·鸿蒙
欣然~2 小时前
鸿蒙系统专利管理系统
华为·harmonyos
南村群童欺我老无力.2 小时前
Flutter 框架跨平台鸿蒙开发 - 打造经典连连看游戏
flutter·游戏·华为·harmonyos
弓.长.2 小时前
React Native 鸿蒙跨平台开发:实现一个模拟计算器
react native·react.js·harmonyos
南村群童欺我老无力.2 小时前
Flutter 框架跨平台鸿蒙开发 - 打造表情包制作器应用
开发语言·javascript·flutter·华为·harmonyos
IT陈图图2 小时前
漫游记:基于 Flutter × OpenHarmony 的旅行记录应用首页实现
flutter·华为·鸿蒙·openharmony
小白阿龙3 小时前
鸿蒙+flutter 跨平台开发——合成大西瓜游戏的实现
flutter·游戏·harmonyos·鸿蒙
小白阿龙4 小时前
鸿蒙+flutter 跨平台开发——快捷记账应用的开发
flutter·华为·harmonyos·鸿蒙
Felven4 小时前
华为鲲鹏920s处理器在统信系统下接收外部GPIO中断问题
华为·统信·鲲鹏920s·gpio中断