Up to date

This page is up to date for Godot 4.3. If you still find outdated information, please open an issue.

进行 HTTP 请求

为什么使用 HTTP?

HTTP 请求可以用来与 Web 服务器以及其他非 Godot 程序通信。

与 Godot 的其他网络功能(例如高阶多人游戏)相比,HTTP 请求的额外开销更大,起步也更慢,所以并不适合实时通信,也不善于进行多人游戏中常见的大量较小更新的发送。

然而,HTTP 提供了与外部 Web 资源的互操作性,并且非常适合发送和接收大量数据,例如传输游戏资产等文件。然后可以使用运行时文件加载和保存来加载这些资产。

所以 HTTP 可以用在游戏的登录系统、大厅浏览器,可以从 Web 获取信息,也可以下载游戏资产。

本教学假设你对Godot和Godot编辑器有一定的了解。请参阅 IntroductionStep by step 教学课程,特别是其 Nodes and ScenesCreating your first script 页面。

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

警告

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