进行 HTTP 请求
为什么使用 HTTP?
HTTP 请求可以用来与 Web 服务器以及其他非 Godot 程序通信。
与 Godot 的其他网络功能(例如高阶多人游戏)相比,HTTP 请求的额外开销更大,起步也更慢,所以并不适合实时通信,也不善于进行多人游戏中常见的大量较小更新的发送。
然而,HTTP 提供了与外部 Web 资源的互操作性,并且非常适合发送和接收大量数据,例如传输游戏资产等文件。然后可以使用运行时文件加载和保存来加载这些资产。
所以 HTTP 可以用在游戏的登录系统、大厅浏览器,可以从 Web 获取信息,也可以下载游戏资产。
Godot 中的 HTTP 请求
在Godot中, 用 HTTPRequest 节点发出HTTP请求是最简单的方法. 它继承自更低级别的 HTTPClient , 相关的教程见 here.
对于此示例,我们将向GitHub发出HTTP请求以检索最新Godot版本的名称。
警告
导出到 Android 时,在导出项目或使用一键部署之前,请确保在 Android 导出预设中启用 Internet 权限。否则,任何类型的网络通信都将被 Android 操作系统阻止。
准备场景
创建一个新的空场景,添加一个根节点 Node 并向其添加一个脚本。然后添加一个 HTTPRequest 节点作为子节点。

编写请求脚本
当项目启动时(所以在 _ready()
中),我们将使用 HTTPRequest 节点向Github发送HTTP请求,一旦请求完成,我们就将解析传回的JSON数据,搜寻 name
字段并将其打印到控制台。
extends Node
func _ready():
$HTTPRequest.request_completed.connect(_on_request_completed)
$HTTPRequest.request("https://api.github.com/repos/godotengine/godot/releases/latest")
func _on_request_completed(result, response_code, headers, body):
var json = JSON.parse_string(body.get_string_from_utf8())
print(json["name"])
using Godot;
using System.Text;
public partial class MyNode : Node
{
public override void _Ready()
{
HttpRequest httpRequest = GetNode<HttpRequest>("HTTPRequest");
httpRequest.RequestCompleted += OnRequestCompleted;
httpRequest.Request("https://api.github.com/repos/godotengine/godot/releases/latest");
}
private void OnRequestCompleted(long result, long responseCode, string[] headers, byte[] body)
{
Godot.Collections.Dictionary json = Json.ParseString(Encoding.UTF8.GetString(body)).AsGodotDictionary();
GD.Print(json["name"]);
}
}
保存脚本和场景,然后运行项目。输出日志中应该会打印 Github 上最新的 Godot 版本的名称。有关解析 JSON 的更多信息见 JSON 类参考。
请注意, 你可能需要检查 result
是否等于 RESULT_SUCCESS
以及JSON解析错误是否发生, 要了解更多信息, 请参阅JSON类型参考和 HTTPRequest .
你必须等待一个请求完成后才能发送另一个请求。一次发出多个请求需要每个请求都有一个节点。一种常见的策略是在运行时根据需要创建和移除 HTTPRequest 节点。
向服务器发送数据
到目前为止, 我们仅限于从服务器上请求数据. 但如果你需要向服务器发送数据呢?这里有一个常见的方法:
var json = JSON.stringify(data_to_send)
var headers = ["Content-Type: application/json"]
$HTTPRequest.request(url, headers, HTTPClient.METHOD_POST, json)
string json = Json.Stringify(dataToSend);
string[] headers = ["Content-Type: application/json"];
HttpRequest httpRequest = GetNode<HttpRequest>("HTTPRequest");
httpRequest.Request(url, headers, HttpClient.Method.Post, json);
设置自定义 HTTP 报头
当然,你也可以设置自定义 HTTP 标头。这些标头以字符串数组的形式提供,每个字符串包含一个标头,格式为 "header: value"
。例如,要设置自定义用户代理(HTTP User-Agent
标头),你可以使用以下代码:
$HTTPRequest.request("https://api.github.com/repos/godotengine/godot/releases/latest", ["User-Agent: YourCustomUserAgent"])
HttpRequest httpRequest = GetNode<HttpRequest>("HTTPRequest");
httpRequest.Request("https://api.github.com/repos/godotengine/godot/releases/latest", ["User-Agent: YourCustomUserAgent"]);
危险
请注意,有人可能会分析和反编译你发布的应用程序,从而可能获得任何嵌入的授权信息,如令牌、用户名或密码。这意味着在你的游戏中,嵌入诸如数据库访问凭据之类的信息,通常不是一个好主意。尽可能避免提供对攻击者有用的信息。