Godot中使用HTTPRequest向MySQL发送昵称报错求助
Godot HTTPRequest 发送昵称到MySQL数据库时的语法错误
我首次为自己和朋友制作FPS游戏,尝试通过Godot的HTTPRequest组件将输入的昵称发送至MySQL数据库,但出现多个语法错误。试过ChatGPT帮忙但没解决,且确认可通过浏览器正常访问server_url。以下是相关代码与报错信息,恳请提供帮助、建议或批评:
Godot代码
extends Node @export var line_edit : LineEdit @export var button : Button @export var http_request : HTTPRequest var server_url : String = "http://192.168.0.30/KanarinGame/sacuvaj_nickname.php" func _on_Button_pressed() -> void: var nickname : String = line_edit.text if nickname != "": print("Poslati nickname: " + nickname) send_nickname_to_server(nickname) else: print("Nickaname nije unet!") func send_nickname_to_server(nickname: String) -> void: var body : String = "nickname=" + nickname var headers : PackedStringArray = PackedStringArray() headers.append("Content-Type: application/x-www-form-urlencoded") var body_data : PackedStringArray = PackedStringArray() body_data.append(body.to_utf8_buffer()) var result = http_request.request(server_url, body_data, headers, HTTPRequest.METHOD_POST) if result != OK: print("Greška pri slanju zahteva!") else: print("Zahtev poslat uspešno!") func _on_HTTPRequest_request_completed(result : int, response_code : int, headers : Array, body : PackedByteArray) -> void: if response_code == 200: print("Uspešno poslato!") else: print("Greška pri slanju: " + str(response_code))
报错信息
res://nickname_screen.gd:30 - Parse Error: Invalid argument for "append()" function: argument 1 should be "String" but is "PackedByteArray". res://nickname_screen.gd:33 - Parse Error: Cannot find member "METHOD_POST" in base "HTTPRequest". res://nickname_screen.gd:33 - Parse Error: Invalid argument for "request()" function: argument 3 should be "HTTPClient.Method" but is "PackedStringArray".
对应报错行
第30行:
body_data.append(body.to_utf8_buffer())
第33行:
var result = http_request.request(server_url, body_data, headers, HTTPRequest.METHOD_POST)
PHP后端代码
<?php $servername = "localhost"; $username = "root"; $password = ""; $dbname = "game_database"; $conn = new mysqli($servername, $username, $password, $dbname); if ($conn->connect_error) { die("Connection failed: " . $conn->connect_error); } if ($_SERVER["REQUEST_METHOD"] == "POST") { $nickname = $_POST["nickname"]; $stmt = $conn->prepare("INSERT INTO players (nickname) VALUES (?)"); $stmt->bind_param("s", $nickname); $stmt->execute(); echo "Nickname je sačuvan!"; $stmt->close(); } else { echo "Nevalidan zahtev!"; } $conn->close(); ?>
问题分析与修复方案
错误1:类型不匹配
第30行中,body.to_utf8_buffer() 返回PackedByteArray类型,但body_data是PackedStringArray,类型无法匹配。且HTTPRequest的request方法接收的body参数应为PackedByteArray,无需包装成数组。
错误2:常量归属错误
HTTP请求方法常量属于HTTPClient类,而非HTTPRequest,需用HTTPClient.METHOD_POST替代。
错误3:参数顺序颠倒
Godot中HTTPRequest.request的参数顺序为:url, method, headers, body,原代码搞反了method和headers的位置。
修复后的Godot代码
extends Node @export var line_edit : LineEdit @export var button : Button @export var http_request : HTTPRequest var server_url : String = "http://192.168.0.30/KanarinGame/sacuvaj_nickname.php" func _on_Button_pressed() -> void: var nickname : String = line_edit.text if nickname != "": print("Poslati nickname: " + nickname) send_nickname_to_server(nickname) else: print("Nickaname nije unet!") func send_nickname_to_server(nickname: String) -> void: # 对昵称做URL编码,避免特殊字符破坏请求格式 var encoded_nickname = URI.encode_component(nickname) var body : String = "nickname=" + encoded_nickname var headers : PackedStringArray = PackedStringArray() headers.append("Content-Type: application/x-www-form-urlencoded") # 直接将字符串转为PackedByteArray作为请求体 var body_data : PackedByteArray = body.to_utf8_buffer() # 修正参数顺序 var result = http_request.request(server_url, HTTPClient.METHOD_POST, headers, body_data) if result != OK: print("Greška pri slanju zahteva!") else: print("Zahtev poslat uspešno!") func _on_HTTPRequest_request_completed(result : int, response_code : int, headers : Array, body : PackedByteArray) -> void: if response_code == 200: # 打印后端返回内容,方便调试 print("Uspešno poslato! 响应内容: " + body.get_string_from_utf8()) else: print("Greška pri slanju: " + str(response_code))
额外建议
- URL编码:添加
URI.encode_component处理昵称,避免空格、&、=等特殊字符导致请求体格式错误。 - 调试优化:在请求完成回调中打印后端返回的字符串,便于排查后端逻辑问题。
- PHP安全优化:可在PHP中添加昵称长度校验,避免无效数据存入;同时添加CORS头(
header("Access-Control-Allow-Origin: *");),避免跨域请求被拦截。
内容的提问来源于stack exchange,提问作者AckeeXZ
相关产品推荐
相关产品推荐

