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 (як-от High-level multiplayer), запити HTTP мають більше накладних витрат і потребують більше часу, тому вони не підходять для спілкування в реальному часі, і Не чудово надсилати багато невеликих оновлень, як це зазвичай буває в багатокористувацькій грі.

Проте HTTP забезпечує взаємодію із зовнішніми веб-ресурсами та чудово підходить для надсилання й отримання великих обсягів даних, наприклад для передачі файлів, як-от ігрових ресурсів. Потім ці ресурси можна завантажити за допомогою runtime file loading and saving.

Таким чином, HTTP може бути корисним для системи входу у вашу гру, лобі-браузера, щоб отримати деяку інформацію з Інтернету або завантажити ресурси гри.

HTTP запити в Godot

Робити HTTP-запити в Godot найпростіше за допомогою вузла HTTPRequest. Він підтримується класом більш низького рівня 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"])

Небезпека

Майте на увазі, що хтось може проаналізувати та декомпілювати вашу випущену програму та таким чином отримати доступ до будь-якої вбудованої інформації авторизації, як-от маркерів, імен користувачів або паролів. Це означає, що зазвичай не варто вбудовувати в гру такі речі, як облікові дані доступу до бази даних. Уникайте надання інформації, корисної для зловмисника, коли це можливо.