Sim*_*tti 8 xml api json web-services
我正在为Web服务设计API,我无法决定使用XML属性,元素还是混合体系结构.
让我举个例子.我们假设我有一个名为Domain的对象.该模型有3个属性(tld
,sld
,trd
和name
本身)和一种方法valid?
,如果所访问的有效返回true.
# I'm using ruby but
# consider this as pseudo-code
class Domain
attr_accessor :tld, :sld, :trd, :name
def valid?
true # force true
end
end
Run Code Online (Sandbox Code Playgroud)
我的api调用/domain/parser
在输入中获取一个域并返回解析后的响应.第一种可能性是为每个域属性使用一个元素.
<result>
<domain>
<name>www.google.it</name>
<tld>it</tld>
...
<valid>true</true>
</domain>
</result>
Run Code Online (Sandbox Code Playgroud)
但是有些接口使用属性.
<result>
<domain tld="it" sld="google.com" trd="www" rule="*.foo" name="www.google.it" valid="true" />
</result>
Run Code Online (Sandbox Code Playgroud)
不要忘记属性和价值.
<result>
<domain tld="it" sld="google.com" trd="www" rule="*.foo" name="www.google.it" valid="true">
www.google.it
</domain>
</result>
Run Code Online (Sandbox Code Playgroud)
在您看来,哪个更强大,更灵活,更富有表现力?另外,请考虑响应将以XML和JSON(很快)提供.
我使用的模式是:
如果您使用XSD架构,那么大多数(如果不是所有的)元数据都应该放在那里,但如果您没有属性,那么它就是好地方.
所以用你的例子我可能会这样做:
<result>
<domain valid="true">
<name>www.google.it</name>
<tld>it</tld>
...
</domain>
</result>
Run Code Online (Sandbox Code Playgroud)
WCF的设计者选择避免属性,主要是出于性能原因.WCF默认序列化程序DataContractSerializer不支持属性(因此可能需要考虑),但它比.NET中更灵活的XmlSerializer快10%左右.
因此,如果您看到自己提供要由WCF客户端使用的内容,您可能会尽可能避免使用属性.
属性永远只是"原子",例如字符串,int等. - 元素提供了更多的灵活性.此外,属性从不存在 - 它们总是被添加到元素上.
根据我的个人经验和个人偏好,我很可能会尽量使用元素并尽可能地避免使用属性.但这真的只是个人偏好和品味 - 属性在XML中绝对有效,没问题.