Выполнение HTTP-запросов

Для чего использовать HTTP?

HTTP-запросы используются для взаимодействия с веб-серверами и программами вне Godot.

По сравнению с другими сетевыми функциями Godot (такими как высокоуровневый мультиплеер), HTTP-запросы создают большую нагрузку и требуют больше времени на выполнение. Поэтому они не подходят для коммуникации в реальном времени и неэффективны для частой отправки небольших обновлений, что типично для мультиплеерных игр.

HTTP, однако, обеспечивает взаимодействие с внешними веб-ресурсами и отлично подходит для передачи больших объёмов данных — например, для пересылки файлов вроде игровых ассетов. Эти ассеты затем можно загружать с помощью загрузки и сохранения файлов во время выполнения.

Таким образом, HTTP может быть полезен для системы входа в игру, браузера лобби, получения данных из интернета или загрузки игровых ассетов.

HTTP запросы в Godot

Узел HTTPRequest — самый простой способ выполнять HTTP-запросы в Godot. Он работает на базе более низкоуровневого HTTPClient, для которого есть отдельное руководство здесь.

В этом примере мы выполним HTTP-запрос к GitHub, чтобы узнать название последнего релиза Godot.

Предупреждение

При экспорте под Android обязательно включите разрешение Интернет в пресете экспорта Android до экспорта проекта или использования развертывания в один клик. Иначе любые сетевые коммуникации будут заблокированы ОС Android.

Подготовка сцены

Создайте новую пустую сцену, добавьте корневой узел Node и присоедините к нему скрипт. Затем добавьте дочерний узел HTTPRequest.

../../_images/rest_api_scene.webp

Написание запроса

При запуске проекта (в методе _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"])

Сохраните скрипт и сцену, затем запустите проект. В выходном логе должно отобразиться название последнего релиза 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)

Настройка собственных HTTP заголовков

Конечно, вы также можете задавать собственные HTTP-заголовки. Они передаются в виде массива строк, где каждая строка содержит заголовок в формате "заголовок: значение". Например, для установки пользовательского агента (HTTP-заголовок User-Agent) можно использовать следующий код:

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

Опасно

Важно понимать злоумышленники могут проанализировать и декомпилировать ваше опубликованное приложение! Так они смогут получить доступ к авторизационным данным — токенам, логинам или паролям. Поэтому настоятельно не рекомендуется хранить в игре критически важную информацию, например учётные данные для доступа к базе данных. По возможности избегайте хранения любой информации, которая может быть полезна атакующему.