我有一个非Rails RESTful API,我可以轻松地与ActiveResource连接,并在我执行查找时获取数据。但是,更新数据并不是那么简单。我认为这是因为API希望XML主体包含在<platform_user>
的非标准XML标记中,而不是<hash>
,这就是GET请求所包含的内容。
在执行update_attributes时如何修改基本XML模板,以便它可以包含<platform_user>
?
通常,我无法以这种方式找到有关使用ActiveResource的指导。你可以指点我的任何书籍或网站吗?
非常感谢。
答案 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)