文章目录
-
- 一、问题描述
- [二、 原因分析及解决方案](#二、 原因分析及解决方案)
-
- [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===服务异常,请稍后重试
二、 原因分析及解决方案
可能的原因如下:
- 网络权限问题:应用可能没有获取网络权限。
- 域名解析失败:设备DNS解析问题,或者域名不正确。
- 网络请求配置问题:在HarmonyOS中,使用网络请求需要正确配置。
步骤检查:
- 确保在模块的module.json5文件中配置了网络权限。
- 检查设备网络连接是否正常。
- 检查请求的域名是否正确,以及服务器是否可访问。
- 如果是使用了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)));
}
}
}
}
七、配置建议
- 开发阶段 :在
hvigorfile.ts中确认网络权限已正确配置 - 真机调试:检查设备的网络设置,确认可以正常访问互联网
- 模拟器调试:确保模拟器网络连接正常
- 域名验证 :使用
nslookup或ping命令验证域名可解析
如果以上方案均无效,请提供:
- 完整的错误堆栈信息
- 应用配置文件内容
- 运行环境(模拟器/真机)
- 访问的具体域名