Иерархии классов в REST API - PullRequest
0 голосов
/ 28 августа 2009

Я разрабатываю сервис 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 ]

2 голосов
/ 28 августа 2009

Ваш вопрос, кажется, касается как использования WFC для REST, так и моделирования модели в REST. У меня была идея по вашему модельному вопросу:

Есть ли лучший дизайн для этого API?

А как насчет введения нового ресурса для моделирования массового ввоза животных? Вы можете назвать это чем-то вроде «Отгрузка».

Отгрузка может быть определена как список новых животных, которые будут введены в зоопарк. Представив Отгрузку в качестве первоклассного ресурса, вы сможете управлять ими, отслеживать, какое Животное пришло на какую Отгрузку (например, чтобы отследить вспышку заболевания), и разрешить отправку в любое время, а не только во время создания зоопарка.

Кроме того, не забывайте, что API REST должны управляться гипертекстом .

1 голос
/ 28 августа 2009

Если вы реализуете интерфейс IXmlSerializable в своих классах, вы можете заставить XML выглядеть так, как вам хочется.

0 голосов
/ 01 сентября 2009

Чтобы ответить на часть моего собственного вопроса:

  • Могу ли я сделать так, чтобы WCF форматировал эти данные первым способом?

Используя XmlSerializer, а не контракты данных по умолчанию, вы можете сделать следующее, чтобы получить нужный XML:

[XmlArrayItem(typeof(Animal))]
[XmlArrayItem(typeof(Snake))]
[XmlArrayItem(typeof(Giraffe))]
List<Animal> Animals { get; set; }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...