从webhook请求解析JSON

问题描述:

使用https://requestb.in,我可以看到webhook正确地发送了header + json正文数据。但是,当我发送json请求到我的服务器时,我得到一个错误解析json。从webhook请求解析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' 
+0

说的ouptput'把request.body.read'? –

+0

@Зелёный抱歉,这是'JSON.parse(request.raw_post)'的输出。我添加了'JSON.parse(request.body.read)'的输出' – Taylor

+0

您是否阅读了我的评论?显示'puts request.body.read'的输出。 –

我认为轨块因为接收到请求CSRF保护 Rails所提供的E,我使用条纹网络挂接但他们对网络挂接文件建议我做以下(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 
+0

我有与OP相同的问题并且我的控制器中有protect_from_forgery行,所以我认为解决方案必须在其他地方找到。 – luissimo

+1

@luissimo正如你所提到的,这并没有解决问题。我使用'protect_from_forgery:except =>:handle_post'和'skip_before_action:verify_authenticity_token,:only => [:handle_post]' – Taylor