运行 发送响应后 sinatra 中的代码

Run code in sinatra after the response has been sent

我是 Ruby 和 Sinatra 的新手,我正在尝试设置一个基本的 sinatra 服务器来侦听 HTTP post 请求,然后处理数据。

我需要在 5 秒内发送响应,否则发送 POST 的服务器(shopify)认为请求失败并重新发送。为避免这种情况,Shopify 建议将处理推迟到响应发送后。

我不确定 Sinatra 发送响应后如何触发我的处理。

这行得通吗?

require 'sinatra'
require 'json'

webhook_data = Order.new
post '/' do
    request.body.rewind
    data = request.body.read
    webhook_data.parsed_json = JSON.parse(data)
    puts "My response gets sent here, right ?"
end

after do
    #DO MY PROCESSING HERE
end

有没有更好的方法来做到这一点?

您可以使用任何 solution for background jobs processing. Here 是 Sidekiq 与 Sinatra 一起使用的示例。

您也可以尝试使用线程:

set :threaded, true

post '/' do
    request.body.rewind
    data = request.body.read
    Thread.new do
      # data processing staff goes here
    end
    # here goes response
end