Attention: Here be dragons
This is the latest
(unstable) version of this documentation, which may document features
not available in or compatible with released stable versions of Godot.
Checking the stable version of the documentation...
Выполнение 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"]);
Опасно
Важно понимать злоумышленники могут проанализировать и декомпилировать ваше опубликованное приложение! Так они смогут получить доступ к авторизационным данным — токенам, логинам или паролям. Поэтому настоятельно не рекомендуется хранить в игре критически важную информацию, например учётные данные для доступа к базе данных. По возможности избегайте хранения любой информации, которая может быть полезна атакующему.