2014-01-19 9 views
12

Ich bin nicht vertraut mit Webhooks, aber ich fühle mich wie sie sind das Richtige für meine App.Verwenden von Webhooks mit Rails

Ich habe die folgende Dokumentation für FluidSurveys webhook

Ich verstehe, wie ich die Webhook durch eine POST Anforderung an ihre API machen kann, aber ich weiß nicht, wie kann ich sagen, wo die Webhook tatsächlich die senden wird Antwort. Kann ich eine beliebige Abonnement-URL übergeben? z.B. https://www.myapp.com/test und ist das, wo webhook wird die Daten senden? Nachdem ich die webhook erstellt habe, bin ich mir nicht sicher, wie ich sicherstellen kann, dass meine Rails-App die Antwort erhält, die initiiert wird. Ich nehme eine Controller-Methode an, die der URL entspricht, die ich dem Webhook zur Verfügung stelle.

Wenn ich auf dem Controller mit dem Webhook richtig bin, wie würde das aussehen?

Jede Anleitung wird geschätzt.

+0

Auf der Gefahr ein Ruck: „Ich bin nicht vertraut mit' thing' aber ich fühle mich wie es das Richtige für mich ist“scheint, wie der falsche Ansatz zu Technologie Entscheidungen. Diese Frage könnte besser gestellt werden als "Ich muss ein Ziel erreichen, was ist die beste Lösung?". – Nick

Antwort

54

WebhooksHaken in Ihre App über eine Rückruf-URL Sie zur Verfügung stellen. Dies ist nur eine Aktion in einem Ihrer Controller, die auf POST Anfragen reagiert und die Webhook-Anfrage behandelt. Jedes Mal, wenn sich etwas am Remotedienst ändert, stellt der Remotedienst eine Anforderung an die von Ihnen angegebene Rückruf-URL, wodurch der Code Aktion ausgelöst wird.

Ich werde beispielhaft mit der Umfrage erstellt Ereignis. Sie beginnen mit der Definition einer Rückrufaktion Aktion für dieses Ereignis, bei der Sie die Anforderung bearbeiten, die vom Webhook stammt. Wie here angegeben reagiert die Webhook mit dem folgenden Aufbau:

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`` 

Lassen Sie sich die Header für jetzt verlassen, sie nicht wichtige Informationen enthalten. Die verfügbaren Körperparameter (survey_creator_name, survey_name usw.) werden alle Details bezüglich der neuen Umfrage wiedergeben, die auf dem Remote-Dienst verfügbar ist. Also lassen Sie uns bitte Rückruf Aktion, die diese Anforderung verarbeitet:

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 

Lassen Sie uns die Route für dieses Add (in config/routes.rb):

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

Dadurch wird die POST /hooks/survey_created_callback Route ermöglicht.

Jetzt müssen Sie diese Rückruf-URL bei der Webhooks-API abonnieren. Zuerst möchten Sie wissen, which hooks stehen Ihnen zur Verfügung. Sie tun dies, indem Sie eine GET-Anforderung an /api/v2/webhooks/ platzieren. In der Antwort finden Sie die Ereignisname, Umfrage und Sammler Parameter.

Schließlich Sie subscribe einem der zuvor genannten Haken durch eine Anfrage an die POST /api/v2/webhooks/subscribe/ URL mit folgendem Inhalt platzieren:

{ 
    "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]" 
} 

Die Antwort auf diese ein Code 201 sein wird, wenn der Haken erfolgreich erstellt wurde oder Code 409, wenn bereits ein Webhook für dieselbe Callback-URL existiert. Oder etwas anderes, wenn das schief ging :)

Sie können jetzt den Hook testen, indem Sie eine Umfrage für den Remote-Dienst erstellen und dann sehen, wie er in Ihrer Rails-App repliziert wird.

Hope this helps ...

+2

Sehr hilfreich. +100 wenn ich könnte, danke! – Luigi

+0

Wenn Sie "einen Hook abonnieren" sagten, meinten Sie, dass Sie eine URL mit dem oben gezeigten JSON-Inhalt erstellen und die URL in die Adressleiste eines Browsers eingeben sollen? –

+1

@ i.am.noob Der Endpunkt zum Abonnieren eines Webhooks ist in diesem Fall ein POST-Endpunkt. Wenn Sie eine URL in die Adressleiste Ihres Browsers eingeben, geben Sie eine GET-Anfrage ein. Ich schlage vor, Sie gehen etwas tiefer in die Unterschiede zwischen GET- und POST-Anfragen ein (das Lesen von PUT und DELETE würde auch nicht schaden). aber ein großer Unterschied ist, dass GET-Anfragen (normalerweise) keinen Körper akzeptieren. das Stück JSON sollte dort in den Anfragetext (der POST-Anfrage) gehen. – lipanski