Виконання HTTP-запитів

Робити HTTP-запити в Godot найпростіше за допомогою вузла HTTPRequest. Він підтримується класом більш низького рівня HTTPClient, про який є стаття тут.

Для цього прикладу ми створимо простий інтерфейс користувача з кнопкою, яка при натисканні запускає HTTP-запит до вказаної URL-адреси.

Попередження

Під час експорту в Android обов’язково ввімкніть дозвіл INTERNET у попередньо налаштованих експортах Android, перш ніж експортувати проект, або використовувати розгортання одним клацанням мишки. Інакше Android заблокує будь-який мережевий зв’язок.

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

Створіть нову порожню сцену, додайте вузол CanvasLayer в якості кореневого і додайте до нього скрипт. Потім додайте до нього два дочірніх вузли: Button і HTTPRequest. Вам потрібно буде підключити такі сигнали до скрипта CanvasLayer:

  • Button.pressed: При натисканні кнопки, ми почнемо запит.

  • HTTPRequest.request_completed: Коли запит буде виконано, ми отримаємо запитувані дані в якості аргумента.

../../_images/rest_api_scene.png

Скриптинґ

Нижче наведено весь код, який нам потрібен, щоб він працював. 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)

При цьому ви повинні побачити в консолі напис (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"])

Зауважте, що для роботи шифрування 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)

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