【问题标题】:Show webservices expose nested or flat lists?显示网络服务公开嵌套或平面列表?
【发布时间】:2026-02-13 11:35:01
【问题描述】:

在设计webservice 时,无论是soapxml 还是json:您更喜欢平面列表还是嵌套列表?

例子:

嵌套:

<carRequest>
   <cars>
     <car>
       <manufature />
       <price />
       <description />
     </car>
     <car>
       <manufature />
       <price />
       <description />
     </car>
   </cars>
</carRequest>

平:

<carRequest>
     <car>
       <manufature />
       <price />
       <description />
     </car>
     <car>
       <manufature />
       <price />
       <description />
     </car>
</carRequest>

一个比另一个有什么优势?

【问题讨论】:

    标签: json xml web-services soap


    【解决方案1】:

    结合个人风格、工具(它们的默认配置、限制或易用性)、需要从单个对象表示支持多种 MIME 类型等优点和缺点。我不打算全部介绍那 - 因为对某些人有用的东西可能对其他人来说不是一个好的解决方案 - 但我只想指出一些事情......

    哪一个看起来更自然,扁平元素还是包裹元素?人们通常如何看待重复的元素?例如,&lt;manufature&gt;&lt;price&gt;&lt;description&gt; 包装在 &lt;car&gt; 元素中。为什么?因为它们是相关的并且共同构成一个结构。多个&lt;car&gt;s 也是相关的,也形成了一个结构:&lt;car&gt;s 的列表。它在您的表示和 XML 模式中更具表现力,并且更具可读性。但是当然,现在我们进入个人偏好和完全战争......

    包裹元素还有另一个优点。你如何表达一个空的汽车列表和一个空的汽车列表?

    如果元素是扁平的并且您没有汽车,那么当您将其解组为对象时,这代表什么?

    <carRequest>
    </carRequest>
    

    您的请求是否有cars = nullcars = []?你不知道。

    如果你使用嵌套元素,那么cars = null 是这样的:

    <carRequest>
    </carRequest>
    

    cars = [] 是这样的:

    <carRequest>
      <cars>
      </cars>
    </carRequest>
    

    由于您提到了 SOAP,您可能在某些时候需要考虑跨技术和工具的互操作性(请参阅Why is it important to be WS-I Basic Profile compliant?),它对 XML 在 SOAP 消息中的外观有规则。 The style called document/literal wrapped pattern is preferred.

    这是一个广泛的主题,作为 TL;DR 我只能想到"choose your poison"。希望我的回答对你有所帮助。

    【讨论】:

    • 因为我还必须在 xml 网络服务旁边创建一个 soap 网络服务,所以我认为 WS-I 兼容是我可以偏爱其中一种模式而不是另一种模式的重点。