Виконання HTTP-запитів¶
Робити HTTP-запити в Godot найпростіше за допомогою вузла HTTPRequest. Він підтримується класом більш низького рівня HTTPClient, про який є стаття тут.
Для цього прикладу ми створимо простий інтерфейс користувача з кнопкою, яка при натисканні запускає HTTP-запит до вказаної URL-адреси.
Попередження
Під час експорту в Android обов’язково ввімкніть дозвіл INTERNET
у попередньо налаштованих експортах Android, перш ніж експортувати проект, або використовувати розгортання одним клацанням мишки. Інакше Android заблокує будь-який мережевий зв’язок.
Підготовка сцени¶
Створіть нову порожню сцену, додайте вузол CanvasLayer в якості кореневого і додайте до нього скрипт. Потім додайте до нього два дочірніх вузли: Button і HTTPRequest. Вам потрібно буде підключити такі сигнали до скрипта CanvasLayer:
Button.pressed: При натисканні кнопки, ми почнемо запит.
HTTPRequest.request_completed: Коли запит буде виконано, ми отримаємо запитувані дані в якості аргумента.
Скриптинґ¶
Нижче наведено весь код, який нам потрібен, щоб він працював. URL-адреса вказує на онлайн-мокер API; він повертає попередньо визначений рядок JSON, який ми потім розберемо, щоб отримати доступ до даних.
extends CanvasLayer
func _ready():
$HTTPRequest.connect("request_completed", self, "_on_request_completed")
func _on_Button_pressed():
$HTTPRequest.request("http://www.mocky.io/v2/5185415ba171ea3a00704eed")
func _on_request_completed(result, response_code, headers, body):
var json = JSON.parse(body.get_string_from_utf8())
print(json.result)
class HTTPRequestDemo : CanvasLayer
{
public override void _Ready()
{
GetNode("HTTPRequest").Connect("request_completed", this, "OnRequestCompleted");
GetNode("Button").Connect("pressed", this, "OnButtonPressed");
}
public void OnButtonPressed()
{
HTTPRequest httpRequest = GetNode<HTTPRequest>("HTTPRequest");
httpRequest.Request("http://www.mocky.io/v2/5185415ba171ea3a00704eed");
}
public void OnRequestCompleted(int result, int response_code, string[] headers, byte[] body)
{
JSONParseResult json = JSON.Parse(Encoding.UTF8.GetString(body));
GD.Print(json.Result);
}
}
При цьому ви повинні побачити в консолі напис (hello:world)
; hello, як ключ, а world, як значення, і обоє в форматі тексту.
Щоб отримати додаткові відомості про розбір JSON, перегляньте посилання на класи для JSON та JSONParseResult.
Зауважте, що ви можете перевірити, чи result
дорівнює RESULT_SUCCESS
, і чи не сталася помилка аналізу JSON, дивіться посилання на клас JSON і HTTPRequest, щоб дізнатися більше.
Звичайно, ви також можете встановити власні заголовки HTTP. Вони подаються у вигляді масиву текстів, причому кожен текст містить заголовок у форматі "заголовок: значення"
. Наприклад, щоб встановити власний агент користувача (заголовок HTTP user-agent
), ви можете використовувати наступне:
$HTTPRequest.request("http://www.mocky.io/v2/5185415ba171ea3a00704eed", ["user-agent: YourCustomUserAgent"])
HTTPRequest httpRequest = GetNode<HTTPRequest>("HTTPRequest");
httpRequest.Request("http://www.mocky.io/v2/5185415ba171ea3a00704eed", new string[] { "user-agent: YourCustomUserAgent" });
Зауважте, що для роботи шифрування SSL/TLS і URL-адрес HTTPS, вам може знадобитися виконати деякі дії, описані тут.
Крім того, викликаючи API за допомогою авторизації, майте на увазі, що хтось може проаналізувати та декомпілювати вашу випущену програму і таким чином отримати доступ до будь-якої вбудованої інформації авторизації, як-от маркери, імена користувачів, або паролі. Це означає, що зазвичай не варто вбудовувати в гру такі речі, як облікові дані доступу до бази даних. По можливості уникайте надання інформації, корисної для зловмисника.
Відправка даних на сервер¶
Досі ми обмежувалися запитом даних із сервера. Але що робити, якщо потрібно відправити дані на сервер? Ось загальний спосіб зробити це:
func _make_post_request(url, data_to_send, use_ssl):
# Convert data to json string:
var query = JSON.print(data_to_send)
# Add 'Content-Type' header:
var headers = ["Content-Type: application/json"]
$HTTPRequest.request(url, headers, use_ssl, HTTPClient.METHOD_POST, query)
public void MakePostRequest(string url, object data_to_send, bool use_ssl)
{
string query = JSON.Print(data_to_send);
HTTPRequest httpRequest = GetNode<HTTPRequest>("HTTPRequest");
string[] headers = new string[] { "Content-Type: application/json" };
httpRequest.Request(url, headers, use_ssl, HTTPClient.Method.Post, query);
}
Майте на увазі, що вам потрібно дочекатися завершення запиту, перш ніж надсилати інший. Для одночасного виконання кількох запитів потрібно мати один вузол на запит. Поширеною стратегією є створення та видалення вузлів HTTPRequest під час виконання, якщо це необхідно.