【发布时间】:2011-12-05 07:18:14
【问题描述】:
我正在尝试为 Web 服务设计一个端点模板。我的主要要求是调用者能够指定应在返回的结果集中填充哪些属性。
我的服务返回部分对象的大型列表(最多 1M 条记录)以及单个完整对象,例如(粗略的 XML 示例,抱歉有点冗长)
列表:
<items>
<item>
<a>aaa</a>
<b>bbb</b>
</item>
<item>
<a>aaaA</a>
<b>bbbB</b>
</item>
</items>
详情:
<item>
<a>aaa</a>
<b>bbb</b>
<c>ccc</c>
...
<w>
<x>xxx</x>
<y>yyy</y>
</w>
<z>zzz</z>
</item>
我考虑过以下想法:
- 返回列表中的全部详细信息
- 创建更短的“列表”项类型
- 传递调用者希望返回的属性名称的字符串数组
我倾向于第三个选项,但我想要一些不同的东西,它不支持子对象,我考虑过传递你想要返回的 xml 架构而不是数组。
我希望 API 支持延迟加载,这也是第 3 种方式似乎可行的原因。
下面是 3. 的函数示例:
public User GetUser(long ID, string[] properties)
然后调用者就可以走了:
User.Email = GetUser(User.ID, "Email").Email
通过大量使用默认值和隐藏空值,返回的 XML 将是:
<User>
<ID>123</ID>
<Email>example@example.com</Email>
</User>
现在上面提到的问题是试图使它与上面的<w> 之类的东西配合得很好,它本身有子项目以及列表有子项目的可能性。
由于我有太多的属性,我不能只为每个属性设置一个 ws 方法。
我正在考虑选项 3。但使用 xml 架构而不是 string[].. 但我想不出一种简单的方法来定义它,我也不想为属性使用字符串名称,例如作为"Email"。
最终计划是拥有一系列常用的预定义模式,只有在高级情况下,我们才需要实际定义请求的属性。但我不知道将与我的 API 通信的所有系统,更不用说它们可能各自需要的属性(我们为每个调用者定制 API 是不可行的)。
还是我把所有事情都复杂化了太多?
【问题讨论】:
标签: web-services api design-patterns soap lazy-loading