进行 HTTP 请求

在Godot中, 用 HTTPRequest 节点发出HTTP请求是最简单的方法. 它继承自更低级别的 HTTPClient , 相关的教程见 here.

这个示例中, 我们将创建一个带有按钮的简单UI, 按下该按钮时将发送对指定网址的HTTP请求.

警告

当导出到 Android 时,在导出项目或使用一键部署之前,确保在 Android 导出预设中启用 INTERNET 权限。否则,任何形式的网络通信都会被 Android 系统阻止。

准备场景

创建一个新的空场景, 添加一个CanvasLayer作为根节点, 并为其添加一个脚本. 然后给它添加两个子节点: 一个Button和一个HTTPRequest节点. 然后需要把以下信号连接到CanvasLayer脚本上:

  • Button.pressed: 按下按钮后, 我们将发送请求.

  • HTTPRequest.request_completed: 当请求完成后, 我们将获取请求的数据作为参数.

../../_images/rest_api_scene.png

编写脚本

下面是我们使其工作所需的所有代码. 该网址指向一个在线API模拟器; 它将返回一个预先定义好的JSON字符串, 然后我们将解析它以获取对数据的访问权限.

GDScriptC#

  1. extends CanvasLayer
  2. func _ready():
  3. $HTTPRequest.connect("request_completed", self, "_on_request_completed")
  4. func _on_Button_pressed():
  5. $HTTPRequest.request("http://www.mocky.io/v2/5185415ba171ea3a00704eed")
  6. func _on_request_completed(result, response_code, headers, body):
  7. var json = JSON.parse(body.get_string_from_utf8())
  8. print(json.result)
  1. class HTTPRequestDemo : CanvasLayer
  2. {
  3. public override void _Ready()
  4. {
  5. GetNode("HTTPRequest").Connect("request_completed", this, "OnRequestCompleted");
  6. GetNode("Button").Connect("pressed", this, "OnButtonPressed");
  7. }
  8. public void OnButtonPressed()
  9. {
  10. HTTPRequest httpRequest = GetNode<HTTPRequest>("HTTPRequest");
  11. httpRequest.Request("http://www.mocky.io/v2/5185415ba171ea3a00704eed");
  12. }
  13. public void OnRequestCompleted(int result, int response_code, string[] headers, byte[] body)
  14. {
  15. JSONParseResult json = JSON.Parse(Encoding.UTF8.GetString(body));
  16. GD.Print(json.Result);
  17. }
  18. }

有了这个, 您应该在控制台上看到 (hello:world) ; hello是关键字,world是值, 两者都是字符串.

有关解析JSON的更多信息, 请参阅类型参考 JSONJSONParseResult .

请注意, 您可能需要检查 result 是否等于 RESULT_SUCCESS 以及JSON解析错误是否发生, 要了解更多信息, 请参阅JSON类型参考和 HTTPRequest .

当然, 您也可以设置自定义的HTTP头部. 它们以字符串数组的形式给出, 每个字符串都包含一个格式为 "header: value" 的头部. 例如, 要设置自定义用户代理(HTTP的 user-agent 头部部分), 您可以像这样使用:

GDScriptC#

  1. $HTTPRequest.request("http://www.mocky.io/v2/5185415ba171ea3a00704eed", ["user-agent: YourCustomUserAgent"])
  1. HTTPRequest httpRequest = GetNode<HTTPRequest>("HTTPRequest");
  2. httpRequest.Request("http://www.mocky.io/v2/5185415ba171ea3a00704eed", new string[] { "user-agent: YourCustomUserAgent" });

请注意, 为了使SSL/TLS加密, 从而使HTTPS URL发挥作用, 你可能需要采取一些额外的操作步骤, 如 here .

此外, 在使用授权调用API时, 请注意有人可能会分析和反编译已发布的应用程序, 因此可能会访问到任何嵌入程序的授权信息, 如令牌, 用户名或密码等. 这意味着在游戏中嵌入诸如数据库访问凭证之类的东西通常不是一个好主意. 尽可能避免提供对攻击者有用的信息.

将数据发送到服务器

到目前为止, 我们仅限于从服务器上请求数据. 但如果你需要向服务器发送数据呢?这里有一个常见的方法:

GDScriptC#

  1. func _make_post_request(url, data_to_send, use_ssl):
  2. # Convert data to json string:
  3. var query = JSON.print(data_to_send)
  4. # Add 'Content-Type' header:
  5. var headers = ["Content-Type: application/json"]
  6. $HTTPRequest.request(url, headers, use_ssl, HTTPClient.METHOD_POST, query)
  1. public void MakePostRequest(string url, object data_to_send, bool use_ssl)
  2. {
  3. string query = JSON.Print(data_to_send);
  4. HTTPRequest httpRequest = GetNode<HTTPRequest>("HTTPRequest");
  5. string[] headers = new string[] { "Content-Type: application/json" };
  6. httpRequest.Request(url, headers, use_ssl, HTTPClient.Method.Post, query);
  7. }

请记住, 在发送另一个请求之前, 您必须等待请求完成. 一次发出多个请求需要每个请求有一个节点. 常见的策略是在运行时根据需要创建和删除HTTPRequest节点.