回答
在 Hamibot 中,你通常不需要也不建议直接使用 OkHttpClient。Hamibot 内置的 http 模块底层已经基于 OkHttp 进行了封装,提供了更符合 JavaScript 习惯的 API,能够覆盖绝大多数自动化脚本的网络请求场景。
为什么不需要直接调用 OkHttpClient
- Hamibot 的脚本运行环境基于 Rhino 1.7.15 引擎,未直接暴露
OkHttpClient的 Java 类。 - 内置
http模块已处理了连接池、超时、Cookie 管理、请求体序列化等底层细节,直接使用可大幅降低脚本复杂度和崩溃风险。 - 对于 PUT、DELETE 或需要高度定制的请求,
http.request()和http.buildRequest()已提供完整的配置入口。
推荐做法:使用内置 http 模块
以下示例展示如何发起自定义方法、自定义 Header 和请求体的请求(兼容 Rhino 引擎):
// 文档地址 https://docs.hamibot.com/
var url = 'https://httpbin.org/put';
var options = {
method: 'PUT',
headers: {
'Content-Type': 'application/json',
'Authorization': 'Bearer your_token'
},
body: JSON.stringify({ key: 'value' }),
timeout: 10000
};
var response = http.request(url, options);
if (response.statusCode === 200) {
log('请求成功: ' + response.body.string());
} else {
log('请求失败,状态码: ' + response.statusCode);
}
如果确实需要 OkHttp 原生能力
若你的场景涉及自定义拦截器、WebSocket、复杂的多部分表单上传等内置模块未直接支持的特性,可以通过以下方式扩展:
- 使用
runtime.loadDex(path)加载包含 OkHttp 及相关依赖的 DEX 文件,随后通过 Java 类调用原生 API。 - 注意:手动加载 DEX 需要自行处理依赖冲突和内存管理,且在不同 Android 版本上可能存在兼容性差异。仅在内置
http模块无法满足时再考虑此方案。
如果你有具体的请求需求(如文件上传、动态 Token 刷新、自定义重试策略等),可以直接描述场景,我会提供基于 http 模块的最佳实践代码。
ℹ️ 内容由 AI 生成,可能不准确,请注意核实
Hamibot 未内置高级 WebSocket 模块,但你可以直接通过 Java 互操作调用底层 OkHttp 的 WebSocket API。以下提供完整且兼容 Rhino 1.7.15 引擎的实现方案:
// 文档地址 https://docs.hamibot.com/
var OkHttpClient = Packages.okhttp3.OkHttpClient;
var Request = Packages.okhttp3.Request;
var WebSocketListener = Packages.okhttp3.WebSocketListener;
var client = new OkHttpClient.Builder()
.connectTimeout(10, java.util.concurrent.TimeUnit.SECONDS)
.readTimeout(0, java.util.concurrent.TimeUnit.SECONDS)
.build();
var request = new Request.Builder()
.url('wss://echo.websocket.org')
.build();
var ws = null;
var listener = new WebSocketListener({
onOpen: function(webSocket, response) {
ws = webSocket;
log('WebSocket 连接成功');
webSocket.send('Hello from Hamibot');
},
onMessage: function(webSocket, text) {
log('收到消息: ' + text);
},
onClosing: function(webSocket, code, reason) {
log('连接关闭中: ' + code + ' ' + reason);
webSocket.close(1000, null);
},
onClosed: function(webSocket, code, reason) {
log('连接已关闭');
},
onFailure: function(webSocket, t, response) {
log('连接失败: ' + t.getMessage());
}
});
client.newWebSocket(request, listener);
// 保持脚本运行,防止主线程退出导致连接断开
setInterval(function() {
// 可在此处添加心跳或状态检查逻辑
}, 5000);
关键注意事项
- 线程上下文:WebSocket 的回调运行在 OkHttp 内部线程,非 Hamibot 主线程。若需在回调中操作 UI 或调用部分 Hamibot API,请使用
ui.run(function() { ... })或threads.start()切换线程。 - 保持脚本存活:Hamibot 脚本在主线程执行完毕后会直接退出。使用
setInterval、setTimeout或while(true) { sleep(1000); }可防止脚本提前结束。 - 心跳与重连:OkHttp 仅负责传输层连接,不处理应用层心跳。你需要自行实现定时发送 ping 消息的逻辑,并在
onFailure或onClosed中重新调用client.newWebSocket(request, listener)实现断线重连。 - 二进制消息:
WebSocketListener包含onMessage(webSocket, ByteString)重载。Rhino 对 Java 方法重载支持有限,若需处理二进制数据,建议优先使用文本协议,或通过JavaAdapter显式实现接口。 - 资源释放:脚本退出前建议调用
ws.close(1000, 'normal')清理连接,避免后台线程残留。
若你需要实现带 Token 鉴权、自动重连机制或心跳保活的完整封装,可提供具体业务场景,我会为你生成对应的最佳实践代码。
ℹ️ 内容由 AI 生成,可能不准确,请注意核实