【问题标题】:Using Webhooks with Rails在 Rails 中使用 Webhook
【发布时间】:2018-12-06 18:56:17
【问题描述】:

我不熟悉 Webhooks,但我觉得它们适合我的应用。

我有以下FluidSurveys webhook 的文档

我了解如何通过POST 向他们的API 发出请求来制作 webhook,但我不知道如何判断 webhook 实际将发送响应的位置。 我可以传递任何我想要的订阅网址吗?例如https://www.myapp.com/testwebhook 发送数据的地方吗?此外,在创建 webhook 之后,我不确定如何确保我的 Rails 应用程序将收到启动的响应。 我假设一个控制器方法与我提供给 webhook 的 url 相对应。

如果我在处理 webhook 的控制器上是正确的,那会是什么样子?

感谢任何指导。

【问题讨论】:

  • 冒着成为混蛋的风险,“我不熟悉thing,但我觉得这对我来说是正确的”似乎是技术选择的错误方法。这个问题最好提出为“我需要完成goal,最好的解决方案是什么?”。

标签: ruby-on-rails webhooks


【解决方案1】:
通过您提供的回调 URL

Webhooks 挂钩到您的应用中。这只是响应 POST 请求并处理 webhook 请求的控制器中的一个操作。每次远程服务发生变化时,远程服务都会向您提供的回调 URL 发出请求,从而触发 action 代码。

我将以 调查创建 事件为例。您首先为此事件定义一个 回调 操作,您可以在其中处理来自 webhook 的请求。如here 所述,webhook 以以下正文响应:

survey_creator_name=&survey_name=MADE+A+NEW+SURVEY&survey_creator_email=timothy@example.com&survey_url=http%3A%2F%2Fexample.com%2Fsurveys%2Fbob%2Fmade-a-new-survey%2F``

让我们暂时保留标题,它们不包含重要信息。可用的正文参数(survey_creator_namesurvey_name 等)将反映有关远程服务上可用的新调查的所有详细信息。所以让我们编写一个回调操作来处理这个请求:

class HooksController

  def survey_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 路由。

现在您需要将此回调 URL 订阅到 Webhooks API。首先,您会想知道which hooks 可供您使用。为此,您可以在/api/v2/webhooks/ 发出 GET 请求。在响应中,您会找到 事件名称surveycollector 参数。

最后,您通过向POST /api/v2/webhooks/subscribe/ URL 发出请求并包含以下内容,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,如果相同回调 URL 的 webhook 已经存在,则响应代码为 409。或者别的什么,如果这不好:)

您现在可以通过在远程服务上创建一个调查,然后观察它在您的 Rails 应用程序中的复制来测试该钩子。

希望这会有所帮助...

【讨论】:

  • 当你说“订阅一个钩子”时,你的意思是用上面显示的 json 内容制作一个 URL 并将 URL 输入到浏览器的地址栏中吗?
  • @i.am.noob 订阅 webhook 的端点在这种情况下是 POST 端点。在浏览器的地址栏中输入 URL 时,您会发出 GET 请求。我建议您更深入地了解 GET 和 POST 请求之间的差异(阅读有关 PUT 和 DELETE 也不会受到伤害)。但一个很大的区别是 GET 请求(通常)不接受正文。那里的那段 JSON 应该进入(POST 请求的)请求正文。
  • 那么...使用 curl 使用终端执行 POST 请求?
  • @i.am.noob 是的,curl 或来自您最喜欢的编程语言的任何 http 库。你也可以使用像 Postman (Chrome) 这样的浏览器插件来发送 POST 请求。
  • 感谢详细而彻底的回答,你太棒了!
猜你喜欢
  • 2012-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-13
  • 2022-01-22
  • 1970-01-01
  • 2012-03-26
  • 2020-03-31
相关资源
最近更新 更多