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

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))

额外建议

  1. URL编码:添加URI.encode_component处理昵称,避免空格、&、=等特殊字符导致请求体格式错误。
  2. 调试优化:在请求完成回调中打印后端返回的字符串,便于排查后端逻辑问题。
  3. PHP安全优化:可在PHP中添加昵称长度校验,避免无效数据存入;同时添加CORS头(header("Access-Control-Allow-Origin: *");),避免跨域请求被拦截。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 03:15:04