Выполнение HTTP-запросов
Для чего использовать HTTP?
HTTP-запросы используются для взаимодействия с веб-серверами и программами вне Godot.
По сравнению с другими сетевыми функциями Godot (такими как высокоуровневый мультиплеер), HTTP-запросы создают большую нагрузку и требуют больше времени на выполнение. Поэтому они не подходят для коммуникации в реальном времени и неэффективны для частой отправки небольших обновлений, что типично для мультиплеерных игр.
HTTP, однако, обеспечивает взаимодействие с внешними веб-ресурсами и отлично подходит для передачи больших объёмов данных — например, для пересылки файлов вроде игровых ассетов. Эти ассеты затем можно загружать с помощью загрузки и сохранения файлов во время выполнения.
Таким образом, HTTP может быть полезен для системы входа в игру, браузера лобби, получения данных из интернета или загрузки игровых ассетов.
HTTP запросы в Godot
Узел HTTPRequest — самый простой способ выполнять HTTP-запросы в Godot. Он работает на базе более низкоуровневого HTTPClient, для которого есть отдельное руководство здесь.
В этом примере мы выполним HTTP-запрос к GitHub, чтобы узнать название последнего релиза Godot.
Предупреждение
При экспорте под Android обязательно включите разрешение Интернет в пресете экспорта Android до экспорта проекта или использования развертывания в один клик. Иначе любые сетевые коммуникации будут заблокированы ОС Android.
Подготовка сцены
Создайте новую пустую сцену, добавьте корневой узел Node и присоедините к нему скрипт. Затем добавьте дочерний узел HTTPRequest.
Написание запроса
При запуске проекта (в методе _ready()) мы отправим HTTP-запрос к GitHub через наш узел HTTPRequest. После завершения запроса мы обработаем полученные 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"]);
}
}
Сохраните скрипт и сцену, затем запустите проект. В выходном логе должно отобразиться название последнего релиза Godot на GitHub. Подробнее о работе с 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-заголовки. Они передаются в виде массива строк, где каждая строка содержит заголовок в формате "заголовок: значение". Например, для установки пользовательского агента (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"]);
Опасно
Важно понимать злоумышленники могут проанализировать и декомпилировать ваше опубликованное приложение! Так они смогут получить доступ к авторизационным данным — токенам, логинам или паролям. Поэтому настоятельно не рекомендуется хранить в игре критически важную информацию, например учётные данные для доступа к базе данных. По возможности избегайте хранения любой информации, которая может быть полезна атакующему.