Это простейший Long Polling микросервис, который выступает в качестве своеобразного WebHook сервера для POST запросов. Принятые данные можно получить с сервера по GET запросу.

Рассчитан для ограниченной среды, где усложнена или отсутствует возможность поднятия Web сервера для своих вебхуков.

Рекомендую прочесть это, если вы представляете LongPolling как GET запрос раз в 10 секунд.

Одной этой схемы достаточно, чтобы понять как все работает на примере Telegram бота

В недавнем посте рассказаны варианты применения этого сервиса. Рекомендую почитать:

Webhook без веб сервера
Если развернуть веб сервер с вебхуком возможности нет, а принимать сообщения от какого-то сервиса (например Telegram) нужно, мы используем polling. Это когда мы сами спрашиваем у сервиса, нет ли у него для нас новостей. В случае с Telegram, это происходит через запрос getUpdates. Но что, если сервис…

API

Мы хотели сделать максимально простой API, поэтому нет никаких токенов, паролей, регистраций. Все данные считаются публичными (любой может прочесть или записать), но вы можете спрятать их, подставив вместо SECRET_UID что-то вроде пароля или токена.

  • GET https://poll.gmod.app/SECRET_UID/getUpdates
  • POST https://poll.gmod.app/SECRET_UID/pushUpdates

Больше ничего. Почти. У GET запроса есть возможность указания некоторых параметров, но сначала покажу пример ответа от GET запроса

Возвращается массив с полями ok, ts и updates. Обратите внимание на ts, он пригодится для формирования GET запроса
  • ?ts=12345. Это offset. Его нужно обновлять каждый раз, когда вы получаете новый апдейт. Без этого параметра каждый раз будут возвращаться все последние апдейты, а следующий параметр sleep не будет обрабатываться, потому что сервер решит, что возвращает вам что-то новое
  • ?sleep=60, default 0, max 60. Время ожидания появления обновлений на сервере. Это время poll.gmod.app будет как бы "висеть". На самом деле он будет удерживать соединение, пока не появятся новые данные или не истечет указанный срок. Без указания sleep смысла с Long Polling мало, ведь суть как раз в удержании соединения до появления данных. После получения данных или сброса по таймауту можно смело заново выполнять GET запрос. sleep=60 означает 1 GET запрос в минуту.

Определение какой сервис прислал апдейт

POST запрос может принять любые параметры. Они будут добавлены в каждый update объект, что полезно для идентификации сервиса, с которого пришел апдейт, если вы указываете один webhook на нескольких сервисах. Например, для определения какой телеграм бот прислал апдейт, я задаю каждому боту вебхук в таком стиле: /setWebhook?url=https://poll.gmod.app/myS3cretU1D/pushUpdates?botname=video_thumbnails_bot.

Теперь на GET https://poll.gmod.app/myS3cretU1D/getUpdates в каждом апдейте будет поле botname=video_thumbnails_bot

Пример библиотеки на Lua для работы с poll.gmod.app

IGS/akupol_sv.lua at main · GM-DONATE/IGS
🛍 Внутриигровой магазин для Garry’s Mod https://git.io/IGS - IGS/akupol_sv.lua at main · GM-DONATE/IGS