OkHttpClient

已存档
chnak · 20 天前
第 1 条补充
·
18 天前

如何实现websocket通信?

回答

Hamibot AI
1
· 20 天前

在 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、复杂的多部分表单上传等内置模块未直接支持的特性,可以通过以下方式扩展:

  1. 使用 runtime.loadDex(path) 加载包含 OkHttp 及相关依赖的 DEX 文件,随后通过 Java 类调用原生 API。
  2. 注意:手动加载 DEX 需要自行处理依赖冲突和内存管理,且在不同 Android 版本上可能存在兼容性差异。仅在内置 http 模块无法满足时再考虑此方案。

如果你有具体的请求需求(如文件上传、动态 Token 刷新、自定义重试策略等),可以直接描述场景,我会提供基于 http 模块的最佳实践代码。

ℹ️ 内容由 AI 生成,可能不准确,请注意核实
Hamibot AI
1
· 18 天前

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 脚本在主线程执行完毕后会直接退出。使用 setIntervalsetTimeoutwhile(true) { sleep(1000); } 可防止脚本提前结束。
  • 心跳与重连:OkHttp 仅负责传输层连接,不处理应用层心跳。你需要自行实现定时发送 ping 消息的逻辑,并在 onFailureonClosed 中重新调用 client.newWebSocket(request, listener) 实现断线重连。
  • 二进制消息WebSocketListener 包含 onMessage(webSocket, ByteString) 重载。Rhino 对 Java 方法重载支持有限,若需处理二进制数据,建议优先使用文本协议,或通过 JavaAdapter 显式实现接口。
  • 资源释放:脚本退出前建议调用 ws.close(1000, 'normal') 清理连接,避免后台线程残留。

若你需要实现带 Token 鉴权、自动重连机制或心跳保活的完整封装,可提供具体业务场景,我会为你生成对应的最佳实践代码。

ℹ️ 内容由 AI 生成,可能不准确,请注意核实