跳转至

HTTP 请求、客户端池与异步批处理

GF 提供请求构建、响应句柄、有界 HTTPRequest 客户端池和批处理聚合,但不内置具体远端服务、鉴权、重试、分页或业务 DTO。

一次性请求

低频、彼此独立的请求可以直接由 GFHttpRequestBuilder 创建临时 HTTPRequest

var builder := GFHttpRequestBuilder.new()
builder.set_url("https://example.com/config")
builder.add_query_parameter("locale", "zh-CN")
builder.set_header("Accept", "application/json")
builder.set_parse_mode(GFHttpRequestBuilder.ParseMode.JSON)
builder.set_max_response_bytes(4 * 1024 * 1024)

var response := builder.execute(get_tree().root)
response.completed.connect(func(result: GFHttpResponse) -> void:
    if not result.is_successful():
        push_warning(result.error)
        return
    print(result.data)
)

有界客户端池

并发 API、配置刷新或 SDK adapter 不应为每次调用长期创建节点。GFHttpClientUtility 复用 HTTPRequest worker,并分别限制活动数和等待队列;它属于 gf.standard.assets package。

在 Installer 中先配置再注册,架构会在后续生命周期激活它:

func install(architecture: GFArchitecture, scope: GFAsyncScope) -> void:
    var http := GFHttpClientUtility.new()
    http.configure(4, 128)
    if not await architecture.register_utility_instance(http):
        architecture.fail_initialization("GFHttpClientUtility 注册失败。")
        return
    if scope.is_cancel_requested():
        return
var http := Gf.get_utility(GFHttpClientUtility, true) as GFHttpClientUtility
if http == null:
    return

var response := http.execute(builder)
response.completed.connect(_on_request_completed)
# response.cancel("screen_closed")

客户端会在 execute() 时复制 builder 状态,调用方后续修改不会改变已排队请求。活动请求达到上限后进入有界队列;队列满时响应立即以 queue_full 失败。Builder 的响应预算 0 表示继承执行传输:一次性 builder.execute() 保留 Godot HTTPRequest 的无限制默认值,客户端池则默认收敛为 16 MiB;正数设置请求级上限,UNLIMITED_MAX_RESPONSE_BYTES 显式关闭限制。超限响应以 response_body_too_large 失败,并保留 Godot 原始 result_codecancel_all() 保留 worker,dispose()client_disposed 取消所有请求并释放节点。显式 request_parent 退出树时,活动响应以 request_worker_lost 终结,不会永久 pending;后续请求不会静默迁移到 SceneTree.root

get_debug_snapshot() 提供活动、排队、空闲 worker 和总 worker 数,适合调试面板或运行时诊断。业务重试必须根据幂等性、状态码、退避和取消边界由项目策略实现,不能由通用池自动重放。

响应与批处理

GFHttpResponse 统一表达 pending、completed、failed 和 cancelled,并保留状态码、headers、文本、原始 bytes、解析数据、错误和 metadata。get_header() / get_header_values() 按大小写不敏感匹配;get_headers_dictionary() 保留重复响应头顺序。

GFAsyncBatch 可以聚合多个 GFHttpResponseGFAsyncCompletion 或手动条目。它支持 ALLANYEACH;新代码优先监听 settled(report) 或读取 get_report(),以区分成功、失败、取消、超时和完成顺序。bind_cancel_token() 绑定外部取消,set_timeout() 设置批处理自己的超时。