You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Godot中HTTPClient request_raw返回ERR_INVALID_PARAMETER问题求助

解决Godot HTTPClient request_raw报错:STATUS_CONNECTED条件不满足

错误原因

HTTPClient.connect_to_host是异步方法,调用后不会立即完成连接。你的代码在调用connect_to_host后直接执行upload_file,此时客户端还处于连接中状态,并未达到STATUS_CONNECTED,因此触发request_raw的参数校验错误。

修复方案

需要等待连接完成后再发送请求,可通过轮询连接状态配合帧等待实现。以下是修改后的完整代码:

extends Node

func _ready():
    var request = HTTPClient.new()
    # 启动异步连接
    var error = request.connect_to_host("www.php.net", 80)
    if error != OK:
        push_error("连接主机失败: %s" % error)
        return
    # 等待连接完成
    yield(self, "idle_frame")
    while request.get_status() == HTTPClient.STATUS_CONNECTING:
        request.poll()
        yield(self, "idle_frame")
    
    if request.get_status() != HTTPClient.STATUS_CONNECTED:
        push_error("连接未成功: %s" % request.get_status())
        return
    
    upload_file(request)

func upload_file(request: HTTPClient) -> void:
    var file_name = "export.png"
    var file = File.new()
    if not file.file_exists('res://%s' % file_name):
        push_error("文件不存在: res://%s" % file_name)
        return
    
    file.open('res://%s' % file_name, File.READ)
    var file_content = file.get_buffer(file.get_len())
    file.close() # 用完文件记得关闭资源

    var body = PoolByteArray()
    body.append_array("--BodyBoundaryHere\r\n".to_utf8()) # 开头无需多余的\r\n,避免格式错误
    body.append_array(("Content-Disposition: form-data; name=\"file\"; filename=\"%s\"\r\n" % file_name).to_utf8())
    body.append_array("Content-Type: image/png\r\n\r\n".to_utf8())
    body.append_array(file_content)
    body.append_array("\r\n--BodyBoundaryHere--\r\n".to_utf8())
    
    var headers = PoolStringArray([
        "Content-Type: multipart/form-data; boundary=BodyBoundaryHere",
        "Content-Length: %d" % body.size() # 添加Content-Length头,帮助服务端解析
    ])

    var error = request.request_raw(HTTPClient.METHOD_POST, "/support", headers, body)
    if error != OK:
        push_error("HTTP请求错误: %s" % error)
        return
    
    # 等待响应处理完成
    yield(self, "idle_frame")
    while request.get_status() == HTTPClient.STATUS_REQUESTING:
        request.poll()
        yield(self, "idle_frame")
    
    # 读取响应内容(可选)
    if request.get_status() == HTTPClient.STATUS_RESPONSE:
        var response = request.read_response_body()
        print("响应内容: ", response.get_string_from_utf8())
    request.close()

额外注意事项

  • connect_to_host之后必须通过poll()驱动连接流程,直到状态变为STATUS_CONNECTED
  • 文件操作完成后务必调用close()释放资源
  • 构建multipart/form-data时,开头的边界符前不要加额外的\r\n,否则可能导致服务端解析失败
  • 发送请求后同样需要通过poll()等待响应状态变化

内容的提问来源于stack exchange,提问作者Fred

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 01:10:54