REST API中的类层次结构

时间:2009-08-28 01:16:14

标签: xml wcf api rest

我正在设计一种可供许多类型客户端使用的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>

看起来在没有高端工具支持的情况下在客户端工作会变得更加棘手,这会产生很多问题:

  • 这个API有更好的设计吗?
  • 第二种格式是否会成为非WCF客户端的问题?
  • 我可以通过第一种方式使WCF格式化这些数据吗?
  • 我应该在XML中使用这些类型的层次结构吗?

3 个答案:

答案 0 :(得分:2)

您的问题似乎是关于使用WFC进行REST以及如何在REST中建模概念。我对你的建模问题有了一个想法:

  

此API有更好的设计吗?

如何引入新资源来模拟动物的大量进口?你可以称之为“货运”。

可以将货件定义为要引入动物园的新动物列表。通过将Shipment作为一流资源公开,您将能够管理它们,跟踪哪个Animal进入哪个货件(例如,追踪疾病爆发),并且可以随时启用货件,而不是就在动物园创建期间。

另外,不要忘记REST APIs must be hypertext-driven

答案 1 :(得分:1)

如果在类上实现 IXmlSerializable 接口,则可以根据需要设置XML。

答案 2 :(得分:0)

回答我自己的部分问题:

  • 我可以通过第一种方式使WCF格式化这些数据吗?

使用XmlSerializer而不是默认的数据合约,您可以执行以下操作,生成所需的XML:

[XmlArrayItem(typeof(Animal))]
[XmlArrayItem(typeof(Snake))]
[XmlArrayItem(typeof(Giraffe))]
List<Animal> Animals { get; set; }