2014-01-19 2 views
12

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

Я следующую документацию для FluidSurveys webhook

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

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

Любые рекомендации приветствуются.

+0

Рискуя быть придурком, «Я не знаком с' thing', но я чувствую, что это правильно для меня», кажется, как неправильного подход к выбору технологии. Этот вопрос может быть лучше сформулирован как «Мне нужно выполнить« цель », какое наилучшее решение?». – Nick

ответ

54

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

Я приведу пример с опросом, созданным. Вы начинаете с определения действия callback для этого события, где вы обрабатываете запрос, поступающий из веб-камеры. Как указано here 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's 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 маршрут.

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

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

{ 
    "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.

Надеется, что это помогает ...

+2

Очень полезно. +100, если бы я мог, спасибо! – Luigi

+0

Когда вы сказали «подписаться на крючок», вы имели в виду создать URL-адрес с указанным выше содержанием json и ввести URL-адрес в адресную строку браузера? –

+1

@ i.am.noob Конечная точка для подписки на webhook - это в данном случае конечная точка POST. при вводе URL-адреса в адресной строке вашего браузера вы делаете запрос GET. Я предлагаю вам углубиться в различия между запросами GET и POST (чтение о PUT и DELETE тоже не повредит). но одна большая разница в том, что запросы GET (обычно) не принимают тело. этот кусок JSON должен попасть в тело запроса (запроса POST). – lipanski