HarmonyOS 鸿蒙Next中有类似okhttp里的dns解析的逻辑吗
HarmonyOS 鸿蒙Next中有类似okhttp里的dns解析的逻辑吗 有人知道在Harmonyos中有没有类似于okHttp中dns解析的逻辑吗?现在想做的是域名请求失败后使用指定的ip访问,但是现在不知道端口号怎么获取?
比如http://www.test.com/test访问不了的时候直接使用http://10.12.34.13:8090/test替换请求。
【解决方案】
httpclient三方库以OKHTTP为基础,依托系统提供的网络请求能力和上传下载能力基础上进行拓展开发,支持自定义DNS解析:通过dns()接口lookup自定义DNS解析。
更多关于HarmonyOS 鸿蒙Next中有类似okhttp里的dns解析的逻辑吗的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
开发者您好,请求报错走interceptor的拦截重试chain.proceed时dns会调用的,您这边如果不再调用是否能提供一下您的demo方便我们这边复现定位到具体问题。
嗯,我大致研究了下发现httpclient可以设置dns,但是如果请求报错走interceptor的拦截重试chain.proceed时dns就不调用了,dns是只在请求时调用一次后续就不在调用了吗?
谢谢你的回答。我这边大致解决了dns的问题,但是发现302重定向时设置dns会导致没有回调,分析源码发现http这个文件中的callback被拦截了,原因是resultLength<contentLength,不太清楚这个逻辑是干啥的,竟然会阻止回调,如果您是这个开源库的参与者,还请给看下,如果不是的话也谢谢你了。
HarmonyOS Next提供了网络管理能力,支持自定义DNS解析。开发者可以通过netmanager模块中的NetAddress类进行DNS操作,包括设置自定义DNS服务器地址。系统也支持异步网络请求,允许在应用层面处理域名解析逻辑,实现类似OkHttp的DNS解析功能。
在HarmonyOS Next中,虽然没有直接命名为“OkHttp”的库,但其ArkTS/ArkUI开发框架提供了强大的网络能力,可以完全实现你所描述的DNS解析及故障转移逻辑。
1. 核心机制:HttpClient与自定义DNS解析
HarmonyOS Next的@ohos.net.http模块中的HttpClient是进行网络请求的核心类。它本身不直接暴露一个与OkHttp完全相同的Dns接口,但其设计允许你在请求层面进行精细控制,实现自定义的域名解析和故障转移。
关键在于使用HttpRequest对象的extraData属性或通过构造不同的HttpRequest对象来实现你的需求。
2. 实现方案:手动解析与请求重试 你的目标逻辑(域名失败后使用指定IP)本质上是一种带特定条件的请求重试机制。端口号信息是包含在原始URL中的,无需单独“获取”。
具体步骤可以如下:
-
步骤一:尝试使用域名进行请求。 首先,使用标准的URL(如
http://www.test.com/test)创建HttpRequest并发送。 -
步骤二:监听请求失败。 在
HttpClient的请求回调(on(‘headerReceive’)或request方法的Promisecatch中)判断请求是否失败。失败原因可能包含DNS解析失败、连接超时等。 -
步骤三:构造备用IP请求。 当判定为需要启用备用IP时,直接使用包含端口号的完整备用URL构造一个新的
HttpRequest对象。 例如,在你的场景中,备用地址http://10.12.34.13:8090/test已经包含了IP(10.12.34.13)和端口(8090)。这个端口号就是你事先为这个服务指定的端口,它通常来源于:- 业务配置(如配置文件)。
- 从原始域名URL中分析得出(如果标准端口80/443被改变,你需要自己解析或配置)。
- 在你这例子中,
8090就是需要和IP配套使用的服务端口。
-
步骤四:发送备用请求。 使用
HttpClient发送这个新的、指向IP地址的请求。
3. 代码思路示例 (ArkTS)
import http from '@ohos.net.http';
import { BusinessError } from '@ohos.base';
let httpClient = http.createHttp();
// 原始请求的URL
let originalUrl: string = 'http://www.test.com/test';
// 预先配置好的备用IP地址(包含端口和路径)
let fallbackIpUrl: string = 'http://10.12.34.13:8090/test';
async function makeRequestWithFallback() {
let request: http.HttpRequest = {
method: http.RequestMethod.GET,
url: originalUrl,
// 可以在这里设置连接超时等参数
};
try {
// 首先尝试用域名请求
let response = await httpClient.request(request);
console.info('Original request succeeded: ' + JSON.stringify(response));
// 处理成功响应...
} catch (error) {
// 捕获请求异常
let err: BusinessError = error as BusinessError;
console.error('Original request failed, code: ' + err.code + ', message: ' + err.message);
// 根据错误码判断是否为网络/连接/DNS相关问题,决定是否触发回退
// 例如,错误码可能是-1(泛型错误)、-2(超时)等,具体需查阅文档
if (shouldFallback(err)) {
console.info('Attempting fallback to IP address...');
// 构造并使用备用IP地址的请求
let fallbackRequest: http.HttpRequest = {
method: http.RequestMethod.GET,
url: fallbackIpUrl, // 直接使用完整的备用URL
};
try {
let fallbackResponse = await httpClient.request(fallbackRequest);
console.info('Fallback request succeeded: ' + JSON.stringify(fallbackResponse));
// 处理备用请求的成功响应...
} catch (fallbackError) {
console.error('Fallback request also failed: ' + JSON.stringify(fallbackError));
// 处理最终失败...
}
} else {
// 其他错误,不进行回退,直接处理
}
}
}
function shouldFallback(error: BusinessError): boolean {
// 实现你的判断逻辑,例如检查错误码是否表示连接失败、DNS解析失败等
// 这里是一个简单示例
return error.code === -1 || error.code === -2;
}
// 调用函数
makeRequestWithFallback();
总结:
HarmonyOS Next通过@ohos.net.http模块的HttpClient,配合ArkTS的异步错误处理逻辑,可以优雅地实现“域名失败后切换指定IP访问”的策略。端口号是你预先知道的或从原始URL中解析的配置信息,在构造备用请求时直接与IP地址组合成完整的URL即可,无需从失败请求中动态“获取”端口。

