Использование Webhooks с Rails

Я не знаком с Webhooks, но я чувствую, что они подходят для моего приложения.

У меня есть следующая документация для Веб-сайт FluidSurveys

Я понимаю, как я могу сделать webhook через запрос POST к их API, но я не знаю, как я могу сказать, где веб-камера действительно собирается отправить ответ. Могу ли я передать любой URL подписки, который я хочу? например https://www.myapp.com/test и что, когда webhook отправит данные? Кроме того, после создания webhook я не уверен, как обеспечить, чтобы мое приложение Rails получало ответ, который был инициирован. Я предполагаю метод контроллера, который соответствует URL-адресу, который я предоставляю веб-кадру.

Если я прав на контроллер, обрабатывающий webhook, что бы это выглядело?

Приветствуется любое руководство.

Ответ 1

Веб-хосты подключаются к вашему приложению через URL-адрес обратного вызова. Это всего лишь действие в одном из ваших контроллеров, который отвечает на запросы POST и обрабатывает запрос webhook. Каждый раз, когда что-то меняется на удаленную службу, удаленная служба делает запрос на URL-адрес обратного вызова, который вы предоставили, и, следовательно, запуская код действия.

Я приведу пример с созданным опросом. Вы начинаете с определения действия callback для этого события, в котором вы обрабатываете запрос, поступающий из веб-узла. Как указано здесь, webhook отвечает следующим телом:

survey_creator_name=&survey_name=MADE+A+NEW+SURVEY&[email protected]&survey_url=http%3A%2F%2Fexample.com%2Fsurveys%2Fbob%2Fmade-a-new-survey%2F``

Теперь оставьте заголовки, они не содержат важной информации. Доступные параметры тела (survey_creator_name, survey_name и т.д.) Будут отражать всю информацию о новом обследовании, доступном на удаленной службе. Поэтому напишите ответное действие, которое обрабатывает этот запрос:

class HooksController

  def survery_created_callback
    # If the body contains the survey_name parameter...
    if params[:survery_name].present?
      # Create a new Survey object based on the received parameters...
      survey = Survey.new(:name => params[:survey_name]
      survey.url = params[:survey_url]
      survey.creator_email = params[:survey_creator_email]
      survey.save!
    end

    # The webhook doesn't require a response but let make sure
    # we don't send anything
    render :nothing => true
  end

end

Добавьте добавочный маршрут для этого (в config/routes.rb):

scope '/hooks', :controller => :hooks do
  post :survey_created_callback
end

Это позволит использовать маршрут POST /hooks/survey_created_callback.

Теперь вам нужно подписаться на этот URL-адрес обратного вызова на API веб-хостов. Сначала вы захотите узнать, что которые перехватывают, доступны вам. Вы делаете это, поставив запрос GET на /api/v2/webhooks/. В ответе вы найдете имя события, параметры опроса и коллектора.

Наконец, вы subscribe к одному из ранее перечисленных крючков, поместив запрос на URL POST /api/v2/webhooks/subscribe/ со следующим содержимым:

{
  "subscription_url": "http://your-absolute-url.com/hooks/survey_created_callback",
  "event": "[EVENT NAME FROM THE HOOKS LIST]",
  "survey": "[SURVEY FROM THE HOOKS LIST]",
  "collector": "[COLLECTOR FROM THE HOOKS LIST]"
}

Ответ на это будет кодом 201, если хост был создан успешно или код 409, если веб-чек для того же URL-адреса обратного вызова уже существует. Или что-то еще, если это пошло плохо:)

Теперь вы можете проверить крюк, создав опрос удаленного сервиса, а затем наблюдайте, как он реплицируется в ваше приложение Rails.

Надеюсь, что это поможет...