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 (як-от 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 як дочірній.
Створення сценарію запиту
Коли проект розпочато (тобто в _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"]);
Небезпека
Майте на увазі, що хтось може проаналізувати та декомпілювати вашу випущену програму та таким чином отримати доступ до будь-якої вбудованої інформації авторизації, як-от маркерів, імен користувачів або паролів. Це означає, що зазвичай не варто вбудовувати в гру такі речі, як облікові дані доступу до бази даних. Уникайте надання інформації, корисної для зловмисника, коли це можливо.