将文件作为multipart / form-data发布到Rails API

时间:2011-07-23 05:06:14

标签: ruby-on-rails api

RoR noob在这里......:)

我需要创建一个Rails API,客户端可以通过POST请求调用并发送XML文件。

我创建了这样的路线:

  namespace :api do
      namespace :v1 do
        resource :report
      end
  end

我的控制器是这样的:

class Api::V1::ReportsController < ApplicationController

  respond_to :xml

  def create
    @report_submission = ReportSubmission.create :login => params[:login],
                                                 :status => :success
    respond_with(@report_submission)
  end
end

我需要在控制器中接收客户端将要发布的XML文件,然后读取内容以便最终将其放入数据库中?

我该如何测试?

我已经创建了一个沙盒项目来尝试这个并且卡住了......不知道接下来该做什么。我把它推到了这里:

https://github.com/claudiolassala/api-samples/

任何帮助都会很棒!     端

2 个答案:

答案 0 :(得分:4)

在做了更多的研究后,我成功地完成了这项工作。我已经使用解决方案在GitHub上更新了my repository

主要的变化是修改我的控制器,以便阅读正在发布的文件的内容:

class Api::V1::ReportsController < ApplicationController

  respond_to :xml

  def create

    @report_submission = ReportSubmission.create :login => params[:login],
                                                 :status => :success,
                                                 :results => read_file_data(params[:reportxml])
    respond_with(@report_submission)
  end

  private
    def read_file_data(file)
      xml_contents = ""
      if file.respond_to?(:read)
        xml_contents = file.read
      elsif file.respond_to?(:path)
        xml_contents = File.read(file.path)
      else
        logger.error "Bad file_data: #{file.class.name}: #{file.inspect}"
      end
      xml_contents
    end
end

我已经修复了执行帖子的Cucumber步骤,将其更改为:

When /^I send a POST request containing the file$/ do
  @login = "some-login"
  @file_path = "#{::Rails.root.to_s}/features/step_definitions/test_report.xml"

  post "api/v1/report.xml?login=#{@login}",
       :reportxml => Rack::Test::UploadedFile.new(@file_path, 'text/xml')
end

请告诉我是否有更好的方法来做到这一点。谢谢!

答案 1 :(得分:0)

除了绝对100%确定发布的任何数据都无害外,你绝对不需要做任何事情:) RESTfull路由在发布xml时以正常方式在控制器操作中为您提供params哈希。这正是ActiveResource的工作原理 所以只是正常地询问你的参数。

唯一可能的问题是Rails期望格式正确的xml可以使用。

最简单的方法是检查发生的情况是尝试将xml文件发布到您的操作,并仔细查看控制器接收到的参数的日志文件

http://apidock.com/rails/ActiveResource/Base以非常详细的方式显示其工作原理(不,您不必通过ActiveResource对象发布xml)

就测试而言,Ryan Bates在ActiveResource上有一个很棒的Railscast http://railscasts.com/episodes/94-activeresource-basicshttp://railscasts.com/episodes/95-more-on-activeresource

他们是旧演员,但仍然完全有效,你可以看到如何测试