使用Ruby on Rails解析XML文件的POST请求

10

我有一个客户端发送XML到我的网站进行解析。我通常使用PHP解析它,但是我不知道如何在Ruby中做到同样的事情。客户说他们将把XML文件发布到我的服务器上(例如下面的代码)。

curl -X POST -H "Content-Type: text/xml" -d "@/path/to/file.xml" my-web-address.com/parser

然后解析处理程序页面需要能够检测到已发送到它的文件,并对其进行解析。这意味着Ruby只是寻找任何POST请求吗?我该如何调用才能将POST内容(XML文件)保存到变量中以便处理?

我正在使用Nokogiri来解析XML。

doc  = Nokogiri::XML(xml)

感谢任何洞察力!

3个回答

13

请注意,您已经可以作为哈希值在params中获取XML内容。但如果您仍然喜欢使用Nokogiri:

def some_action
  doc = Nokogiri::XML(request.body.read) # or Nokogiri::XML.fragment
  ...
end

3
如果您正在使用Rails,则应该“解码”XML POST请求。例如:
<?xml version="1.0"?>
<group id="3">
  <point>
    <value>70.152100</value>
  </point>
  <point>
    <value>69.536700</value>
  </point>
</group>

这个参数可以在params变量中找到。

params['group']['id'] # => '3'

如果您一定要使用Nokogiri,那么听起来您的xml格式不正确,请尝试:

Nokogiri::XML.fragment(request.body.read)

谢谢!现在一切都准备就绪了。 - Brian Weinreich
这个功能从Rails 4开始已经从核心中移除了。现在我们需要使用一个单独的gem,https://github.com/rails/actionpack-xml_parser。 - bloudermilk

2

无需外部 gem 的简单解决方案:

class MyController < ApplicationController

  def postxml
    h = Hash.from_xml(request.body.read)
    Rails.logger.info h

    render status: 200
  end

end

我稍微改进了一下,将 .with_indifferent_access 添加到 Hash 行的末尾,以允许无差别访问。 - Daniel Hollands

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接