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/
任何帮助都会很棒! 端
答案 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-basics和http://railscasts.com/episodes/95-more-on-activeresource
他们是旧演员,但仍然完全有效,你可以看到如何测试