Запросы HTTPS/HTTP

Ren'Py поддерживает получение информации по HTTP и HTTPS с помощью функции renpy.fetch. Эта функция:

  • Поддерживает GET, POST и PUT-запросы.

  • Поддерживает отправку на сервер данных или json-объектов через POST или PUT.

  • Может возвращать результат в виде байтов, строки или json-объекта.

Функция fetch предназначена для использования в основном потоке Ren'Py после запуска игры. Её можно использовать на десктопах, мобильных устройствах и на веб-платформе. При использовании на веб-платформе, если запрос идёт не на тот же сервер, который изначально обслуживал игру, сервер должен поддерживать CORS.

В качестве очень простого примера, вот так можно получить новости с сервера:

$ news = renpy.fetch("https://example.com/news.txt", result="text")
"Вот новости: [news]"

А вот так можно отправить JSON на сервер и получить JSON в ответ:

$ result = renpy.fetch("https://example.com/api", json={"name": "Ren'Py"}, result="json")

Как и в любом приложении, которое взаимодействует по сети, при использовании renpy.fetch необходимо учитывать вопросы безопасности, особенно при отображении полученных таким образом медиафайлов. (Ren'Py в целом не защищён от вредоносных изображений, видео- и аудиофайлов.)

renpy.fetch(url, method=None, data=None, json=None, content_type=None, timeout=5, result='bytes', params=None, headers={})

Выполняет HTTP (или HTTPS) запрос по указанному URL и возвращает содержимое этого запроса. В случае сбоя вызывает исключение FetchError с текстом, описывающим сбой. (Однако этот текст может быть не предназначен для показа пользователю.)

url

URL для запроса.

method

Используемый метод. Обычно один из "GET", "POST" или "PUT", но возможны и другие методы HTTP. Если data или json не равны None, по умолчанию используется "POST", в противном случае — GET.

data

Если не None, байтовая строка данных для отправки с запросом.

json

Если не None, объект JSON для отправки с запросом. Имеет приоритет над data.

content_type

Тип содержимого данных. Если не указан, по умолчанию используется "application/json", если json не None, или "application/octet-stream" в противном случае. Используется только в запросах POST или PUT.

timeout

Количество секунд ожидания завершения запроса.

result

Способ обработки результата. Если "bytes", возвращает необработанные байты результата. Если "text", декодирует результат с использованием UTF-8 и возвращает строку unicode. Если "json", декодирует результат как JSON. (В процессе декодирования могут возникать другие исключения.)

params

Словарь параметров, которые добавляются к URL в виде строки запроса.

headers

Словарь заголовков для отправки с запросом.

Эту функцию можно вызывать как внутри, так и вне интерактивного контекста.

  • Вне интерактивного контекста, в ожидании истечения timeout, эта функция будет многократно вызывать renpy.pause(), чтобы Ren'Py не зависал. Имеет смысл показать пользователю экран, информирующий о происходящем.

  • Внутри интерактивного контекста (например, внутри Action), эта функция заблокирует систему отображения до тех пор, пока запрос не завершится или не истечёт время ожидания. Она будет пытаться обслуживать аудиосистему, поэтому звук продолжит воспроизводиться.

Эта функция должна работать на всех платформах. Однако на веб-платформе запросы, направленные на источник, отличный от источника игры, завершатся неудачей, если это не разрешено CORS.

Requests

На десктопах и мобильных устройствах Ren'Py включает библиотеку Requests. Она более мощная, но интегрируется не так хорошо, как renpy.fetch. (Например, Ren'Py вызовет renpy.pause() для ожидания данных, в то время как requests заблокирует выполнение, что может привести к таким проблемам, как прерывание звука.)