跳到主要内容

HTTP 客户端

core.network.NetworkModule 封装 Java HTTP 客户端。它适合读取外部赛季信息或比赛服务,与 Minecraft 的 C2S/S2C 消息频道相互独立。

创建模块

NetworkModule module = new NetworkModule.Builder()
.baseUrl("https://example.invalid/api")
.connectTimeout(5, TimeUnit.SECONDS)
.followRedirects(true)
.build();

导入 core.network.NetworkModulejava.util.concurrent.TimeUnit。示例域名需替换成你的服务地址。当前 API 使用 new NetworkModule.Builder(),没有静态 builder() 方法。

模块适合由一个服务器会话或业务服务持有,重复请求复用它。不要每 tick 创建客户端和线程池。

请求与解码

使用 Codec 专题中的 SeasonStats

module.newRequest(SeasonStats.CODEC)
.setRequestMethod(RequestMethod.GET)
.addPath("seasons/current")
.executeAsync()
.thenAccept(response -> {
if (!response.isSuccessful() || response.getData() == null) return;
SeasonStats snapshot = response.getData();
server.execute(() -> SeasonStore.load(snapshot));
});

RequestMethod 位于 core.networkserver 是发起任务的服务器,SeasonStore独立数据保存。真实业务还需处理异常并丢弃已经过期的请求结果。

直接在请求构造器上调用 executeAsync()buildRequest() 返回底层 HttpRequest,不能再链式调用框架的 executeAsync()

响应与失败

ApiResponse 提供状态码、响应头、原始正文、解码数据和错误。非 2xx 响应或 Codec 解码错误应通过 isSuccessful() 等字段处理;连接等异常也可能使 Future 异常完成。

连接超时只限制建立连接的等待,不等于完整业务请求的超时。需要整体截止时间时,可在异步任务外明确设置超时策略,并决定失败后保留旧数据还是显示不可用状态。

生命周期

异步线程负责 HTTP 与纯数据解码,服务器执行器负责地图和玩家状态。服务器关闭或业务服务销毁时调用 shutdown()。当前实现会关闭通过客户端可取得的自定义执行器并标记模块关闭;不要把共享线程池交给一个随地图销毁的模块独占管理。

文件落盘、进度和下载任务的执行器行为见文件下载