当我将update_attributes发送到RESTful API时,如何更改XML标记?

时间:2012-05-10 17:46:35

标签: ruby-on-rails activeresource

我有一个非Rails RESTful API,我可以轻松地与ActiveResource连接,并在我执行查找时获取数据。但是,更新数据并不是那么简单。我认为这是因为API希望XML主体包含在<platform_user>的非标准XML标记中,而不是<hash>,这就是GET请求所包含的内容。

在执行update_attributes时如何修改基本XML模板,以便它可以包含<platform_user>

通常,我无法以这种方式找到有关使用ActiveResource的指导。你可以指点我的任何书籍或网站吗?

非常感谢。

2 个答案:

答案 0 :(得分:1)

如果您的问题只需在父节点内重命名或换行即可解决,我真的会感到非常惊讶,而且我假设您在接近解决方案时会遇到更多服务问题。我(不幸的是)之前一直在这艘船上,所以我正在写我所学到的东西。

一般来说,当服务需要一些复杂或丑陋的XML时,我发现通过ActiveResource处理服务有点困难。在这些情况下,我的解决方案不可避免地会覆盖对象的to_xml方法,因为create(POST)或更新(PUT)应该在内部调用对象的to_xml以将数据序列化为XML。所述方法可以使用ruby的xml构建器,也可以使用'here document'来处理更棘手的问题。我认为最重要的是,您必须知道完全您的服务期望并构建该结构以发送给服务。

例如使用'here document'强制使用不友好的xml结构:

class User << ActiveResource::Base

  def to_xml
    xml =<<-EOS
      <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
      <platform_user>
        <user xsi:type="userData" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
          <userId>#{self.id}</userId>
          <userName>#{self.name}</userName>
          <addresses>
            <address>
              <address1>#{self.address1}</address1>
              <addressZip>#{self.zip}</addressZip>
            </address>
          </addresses>
        </user>
      </platform_user>
    EOS
    xml.gsub(/\n|\t|\r/,"").strip #clean it up.
  end
end

您也可以使用它适用于您的结构的XML Builder,例如:

def to_xml
  xml = Builder::XmlMarkup.new()
    xml.instruct! :xml, :version => "1.0", :encoding => "UTF-8", :standalone=>"yes"
    xml.platform_user do
        xml.user do
          xml.userId self.id
          ...
        end
    end
end 
祝你好运。

答案 1 :(得分:0)

尝试为PlatformUser创建一个类。

class PlatformUser < ActiveResource::Base

然后使用这些值来设置此对象中的属性,而不是填充哈希值。

更改

platform_user_data = { :name => "foo", :level => 15 }

platform_user_attrs = { :name => "foo", :level => 15 }
platform_user = PlatformUser.new(platform_user_attrs)