进行 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 节点作为子节点。

../../_images/rest_api_scene.webp

编写请求脚本

当项目启动时(所以在 _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"])

保存脚本和场景,然后运行项目。输出日志中应该会打印 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)

设置自定义 HTTP 报头

当然,你也可以设置自定义 HTTP 标头。这些标头以字符串数组的形式提供,每个字符串包含一个标头,格式为 "header: value"。例如,要设置自定义用户代理(HTTP User-Agent 标头),你可以使用以下代码:

$HTTPRequest.request("https://api.github.com/repos/godotengine/godot/releases/latest", ["User-Agent: YourCustomUserAgent"])

危险

请注意,有人可能会分析和反编译你发布的应用程序,从而可能获得任何嵌入的授权信息,如令牌、用户名或密码。这意味着在你的游戏中,嵌入诸如数据库访问凭据之类的信息,通常不是一个好主意。尽可能避免提供对攻击者有用的信息。