Ruby on rails 如何使用RubyonRails处理外部API回调?

Ruby on rails 如何使用RubyonRails处理外部API回调?,ruby-on-rails,Ruby On Rails,我需要一些指导。我正在使用6px.io API调整图像大小。转换可能需要几秒钟,当图像已发送/存储在S3存储桶中时,6px会向我发送一个post回调。在回调之后,当图像被调整大小并保存时,我们希望将文件从S3存储桶下载到用户的浏览器中 如果调整大小的图像已经在我们的S3存储桶中,并且不需要由6px处理,我们将使用send_data将文件下载给用户。不幸的是,我不能使用回调控制器操作上的send_数据来启动向用户下载文件。这在Rails中是如何实现的 用户故事: 单击下拉菜单中的“图像的中等大小”

我需要一些指导。我正在使用6px.io API调整图像大小。转换可能需要几秒钟,当图像已发送/存储在S3存储桶中时,6px会向我发送一个post回调。在回调之后,当图像被调整大小并保存时,我们希望将文件从S3存储桶下载到用户的浏览器中

如果调整大小的图像已经在我们的S3存储桶中,并且不需要由6px处理,我们将使用send_data将文件下载给用户。不幸的是,我不能使用回调控制器操作上的send_数据来启动向用户下载文件。这在Rails中是如何实现的

用户故事:

单击下拉菜单中的“图像的中等大小”菜单项。 Rails控制器操作使用回调后url构建JSON并发送到6px。 6px返回JSON,其中包含输入和输出信息以及状态完成/失败。 文件开始下载到用户的计算机/浏览器***这就是我需要帮助的地方。 示例代码这是用于工作的,无法发布真实代码:

class FakeExampleController < ApplicationController

  def convert_image
    # code ommitted
    @fake_example = FakeExample.find_by(:id)
    image_conversion(params)
  end

  def callback
    # width, height, type variable code ommitted

    if params['status'] == 'complete' 
      converted_file = FakeConvertedImage.create!(filename: @new_file_name, attachment_id:   @fake_example.id, format: type, width: width, height: height)

      send_converted_file( :url => "OUR_S3_BUCKET", :filename => "#{converted_file.filename}", :type => "#{type}", :disposition => 'attachment' )  #This does not work to download file to user's browser.
    else
      raise
        "Image Conversion Failed"
    end
  end

  def image_conversion(params)
    callback_url = fake_example_url.gsub(/localhost:3000/, '********.ngrok.com')

    image_converter = ImageConverter.new(params) #This is a wrapper I made for the 6px-ruby gem
    image_converter
      .convert_type(@fakeexample.mime_type_for_6px(params[:mimetype])
      .resize_images
      .save("OUR_S3_BUCKET_URL", callback_url)
  end

  def send_converted_file(opts={})
    other_opts = opts.select{ |opt,v| /(filename|type|disposition)/ === opt }
    response = { url: opts.fetch(:url), :opts => other_opts }

    send_data( open(URI.encode(response[:url].to_s)).read, response[:opts] )
  end
end

我没有任何错误。我只需要关于如何将保存在S3中的文件下载给用户的建议。

如果您发布到目前为止的代码,回答这个问题会容易得多。@Jordan我没有收到任何错误,因此我不确定代码会有什么帮助。这也是为了工作,所以我不能发布真正的代码。我已经发布了一些类似的示例代码供参考。您似乎在用户请求/响应周期之外收到了回调。要让浏览器在回调后下载文件,您需要一些机制让浏览器知道何时可以获取文件。这对你有意义吗?或者我完全忽略了这个问题?@IsmaelAbreu这是有道理的,但我不知道有什么东西可以让浏览器知道它什么时候可以获取文件。我可以使用sidekiq worker或类似ping/检查正在处理的作业的状态来代替回调操作/方法吗?这似乎是与外部API交互时的常见问题。使用回调方法似乎很好。您只需要一种通知浏览器文件已准备就绪的方法。为此,您需要一些javascript。您可以通过ping服务器来检查下载是否准备就绪。或者你可以使用一些推动策略。但投票方式应该可以。比如每隔5秒钟询问一次文件是否准备就绪,并在服务器说它准备就绪时将用户重定向到文件url