1

我有一个非 Rails RESTful API,我可以轻松地使用 ActiveResource 连接到它,并且在我进行查找时获取数据很简单。但是,更新数据并不那么简单。我认为这是因为 API 希望将 XML 主体包装在这个非标准 XML 标记中, <platform_user>而不是<hash>GET 请求被包装在哪个标记中。

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

通常,我找不到太多关于以这种方式使用 ActiveResource 的指导。有什么书或网站可以指点我吗?

非常感谢。

4

2 回答 2

1

如果您的问题将通过简单地重命名或包装在父节点中来解决,我实际上会感到非常惊讶,并且我假设您在接近解决方案时会遇到更多的服务问题。我(不幸的是)以前曾在这艘船上,所以我正在写我学到的东西。

一般来说,当服务需要一些复杂或丑陋的 XML 时,我发现通过 ActiveResource 处理服务有点困难。在这些情况下,我的解决方案不可避免地会覆盖对象的 to_xml 方法,因为创建 (POST) 或更新 (PUT) 应该在内部调用对象的 to_xml 以将数据序列化为 XML。所述方法可以使用 ruby​​ 的 xml 构建器,或者您也可以使用“此处文档”来处理更棘手的内容。我认为底线是,您必须确切地知道您的服务期望什么,并构建该结构以发送给服务。

例如使用 '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 

祝你好运。

于 2012-05-26T23:53:29.237 回答
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)
于 2012-05-10T17:51:14.630 回答