从webhook请求中解析JSON

loo*_*oop 7 ruby ruby-on-rails webhooks

使用https://requestb.in,我可以看到webhook正确发送标题+ json正文数据.但是当我将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
Run Code Online (Sandbox Code Playgroud)

错误输出:

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)
Run Code Online (Sandbox Code Playgroud)

的routes.rb

  post "/receive"  => 'receiver#handle_post'
Run Code Online (Sandbox Code Playgroud)

Amr*_*del 0

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

如果您使用 Rails、Django 或其他 Web 框架,您的站点可能会自动检查每个 POST 请求是否包含 CSRF 令牌。这是一项重要的安全功能,有助于保护您和您的用户免受跨站点请求伪造尝试。但是,此安全措施也可能会阻止您的网站处理合法的 Webhook。如果是这样,您可能需要使 Webhooks 路由免受 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
Run Code Online (Sandbox Code Playgroud)