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
相关产品推荐
相关产品推荐

