我正在设计一种可供许多类型客户端使用的REST服务,最有可能是.Net,PHP,Flex和JavaScript。我正在使用WCF和REST入门工具包构建服务。我的主要目标之一是让所有客户尽可能简单地使用API。
假设API处理动物园。当客户创建一个新的动物园时,如果他们可以传递最初的动物组合就会很好,所以他们只需要对API进行一次调用,例如
<Zoo>
<Name>My Zoo</Name>
<Animals>
<Snake>
<Name>Frank</Name>
<Length>2.5m</Name>
</Snake>
<Giraffe>
<Name>Alfred</Name>
<Height>10m</Height>
</Giraffe>
</Animals>
</Zoo>
然后我想将XML反序列化为C#类,如下所示:
List<Animal> Animals { get; set; }
class Animal { public string Name { get; set; } }
class Snake : Animal { public float Length { get; set; } }
class Giraffe : Animal { public float Height { get; set; } }
WCF不喜欢这样,因为它希望XML格式如下:
<Zoo xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<Name>My Zoo</Name>
<Animals>
<Animal i:type="Snake">
<Name>Frank</Name>
<Length>2.5m</Name>
</Animal>
<Animal i:type="Giraffe">
<Name>Alfred</Name>
<Height>10m</Height>
</Animal>
</Animals>
</Zoo>
看起来在没有高端工具支持的情况下在客户端工作会变得更加棘手,这会产生很多问题:
答案 0 :(得分:2)
您的问题似乎是关于使用WFC进行REST以及如何在REST中建模概念。我对你的建模问题有了一个想法:
此API有更好的设计吗?
如何引入新资源来模拟动物的大量进口?你可以称之为“货运”。
可以将货件定义为要引入动物园的新动物列表。通过将Shipment作为一流资源公开,您将能够管理它们,跟踪哪个Animal进入哪个货件(例如,追踪疾病爆发),并且可以随时启用货件,而不是就在动物园创建期间。
答案 1 :(得分:1)
如果在类上实现 IXmlSerializable 接口,则可以根据需要设置XML。
答案 2 :(得分:0)
回答我自己的部分问题:
使用XmlSerializer而不是默认的数据合约,您可以执行以下操作,生成所需的XML:
[XmlArrayItem(typeof(Animal))]
[XmlArrayItem(typeof(Snake))]
[XmlArrayItem(typeof(Giraffe))]
List<Animal> Animals { get; set; }