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.

Выполнение 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"])

Опасно

Be aware that someone might analyze and decompile your released application and thus may gain access to any embedded authorization information like tokens, usernames, or passwords. That means it is usually not a good idea to embed things such as database access credentials inside your game. Avoid providing information useful to an attacker whenever possible.