从 webhook 请求中解析 JSON

Posted

技术标签:

【中文标题】从 webhook 请求中解析 JSON【英文标题】:Parse JSON from webhook request 【发布时间】:2018-02-17 23:47:16 【问题描述】:

使用https://requestb.in,我可以看到 webhook 正确地发送了 header + json body 数据。但是当我将 json 请求发送到我的服务器时,解析 json 时出现错误。

我的控制器(无法接收身体数据):

class ReceiverController < ApplicationController
    skip_before_filter :verify_authenticity_token

    def handle_post
        puts request.headers['Content-Type']
        puts "request:"
        puts JSON.parse(request.raw_post)
        puts "request2:"
        puts JSON.parse(request.body.read)
    end
end

错误输出:

application/json; charset=utf-8
request:
JSON::ParserError (A JSON text must at least contain two octets!):
app/controllers/receiver_controller.rb:69:in `handle_post'
request2:
Completed 500 Internal Server Error in 7ms (ActiveRecord: 0.0ms)

Routes.rb

  post "/receive"  => 'receiver#handle_post'

【问题讨论】:

puts request.body.read的输出? 我认为这个问题需要更多信息来通过提供 MCV 示例 (***.com/help/mcve) 来帮助回答: 1) 您能否添加一个示例来说明您是如何提出请求的? 2) ApplicationController 是什么样的? 3)您使用的是哪个版本的 Rails(看起来可能是旧版本)? 你能发布request的输出吗? 正如许多 cmets 指出的那样,请求没有通过。事实证明,接收器 url(托管在 heroku 上)需要是 https(安全),否则请求将被拒绝。如果请求返回 nil,其他有类似问题的人应该仔细检查他们的路由/url。 感谢@Taylor 发布解决方案。但是,如果您能抽出时间用解决方案编写答案(并接受它)而不是将解决方案隐藏在 cmets 中(只有在单击展开后才可见),那将是一件好事。 【参考方案1】:

我认为 rails 会阻止接收请求,因为 rails 提供了 CSRF-protection,我是使用 stripe webhooks 的初学者,但他们的 webhook 文档建议我执行以下操作 (https://stripe.com/docs/webhooks):

如果您使用 Rails、Django 或其他 Web 框架,您的网站可能会自动检查每个 POST 请求是否包含 CSRF 令牌。这是一项重要的安全功能,可帮助保护您和您的用户免受跨站点请求伪造尝试的影响。但是,此安全措施也可能会阻止您的网站处理合法的 webhook。如果是这样,您可能需要使 webhook 路由免受 CSRF 保护。

class ReceiverController < ApplicationController
 # If your controller accepts requests other than webhooks,
 # you'll probably want to use `protect_from_forgery` to add CSRF
 # protection for your application. But don't forget to exempt
 # your webhook route!
 protect_from_forgery :except => :handle_post

 def handle_post
  # Process webhook data in `params`
 end
end

【讨论】:

我和 OP 有同样的问题,我的控制器中有protect_from_forgery 行,所以我认为必须在其他地方找到解决方案。 @luissimo 正如您所提到的,这并没有解决问题。我同时使用protect_from_forgery :except =&gt; :handle_postskip_before_action :verify_authenticity_token, :only =&gt; [:handle_post]

以上是关于从 webhook 请求中解析 JSON的主要内容,如果未能解决你的问题,请参考以下文章

在 .NET 中验证 Mandrill 入站 Webhook 请求

接收不到shopify webhook 发送post请求

如何从Calendly获得现有的webhook(来自json的解析)?

为啥我没有收到 Facebook Messenger webhook 请求中的附件?

Google PubSub / Gmail Webhook:发送电子邮件时始终从 PubSub 接收多个 POST 请求

从Django中的Dialogflow访问webhook信息