Правильно ли я проектирую этот интерфейс WCF RESTful? - PullRequest
9 голосов
/ 14 сентября 2011

Я создаю веб-сервис WCF со службой аутентификации WcF, и первый набор функций, который мне нужен, - это управление почтовым ящиком для клиента.Клиент будет определен по аутентификации.

Это моя попытка RESTful дизайна API:


https://api.mydomain.com/v1/inbox/messages (GET)

Возвращает страницу результатовв папке «Входящие» с примененным дополнительным фильтром поиска

  • Количество - количество записей на странице
  • Страница - страница для запуска на
  • Сортировка - (необязательно) поле длясортировать по
  • Поиск - (необязательно) текст для поиска

https://api.mydomain.com/v1/inbox/mark (POST)

Помечает одно или несколько сообщений как прочитанные или непрочитанные

  • Действие - MarkRead или MarkUnread
  • MessageID - список идентификаторов сообщений для отметки

https://api.mydomain.com/v1/inbox/archive (POST)

Архивирование одного или нескольких сообщений

  • MessageID - список идентификаторов сообщений для архивирования

Я правильно делаю?Если нет, то как лучше разработать этот интерфейс?

Ответы [ 3 ]

1 голос
/ 30 сентября 2011

У Мартина Фаулера есть хорошее резюме модели зрелости Ричардсона и то, что нужно для предоставления услуги RESTful.Ян сослался на один из постов Роя Филдинга, но есть некоторые шаги, которые нужно позаботиться в дополнение к гипермедиа (и HATEOAS ).

Применительно к модели Ричардсона Я думаю, что вашему API понадобятся некоторые изменения, чтобы добраться до "Уровня 3" (duh duh duhhhh).Коллекция /v1/inbox/messages выглядит звучащей, и только поддержка GET указывает, что это ресурс только для чтения для пользователя.Однако POST действие и идентификаторы для /v1/inbox/mark и /v1/inbox/archive только туннелируют службы в стиле RPC через HTTP - «Уровень 0» в статье .

Я бы предложил что-то вроде следующего как наивный, не гипермедиа (то есть "Уровень 2") API:

  • Чтобы получить список сводной информациивсех сообщений (во всех папках):

    GET /v1/messages HTTP/1.1
    Host: api.mydomain.com
    

    Ответ:

    content-type: text/xml
    
    <?xml version="1.0"?>
    <messages>
      <message subject="Subject" unread="true" id="1234" folder="inbox" />
      <message subject="Hello, world" unread="false" id="24" folder="inbox" />
      ...
    </messages>
    
  • Чтобы получить полное сообщение:

    GET /v1/messages/1234 HTTP/1.1
    Host: api.mydomain.com
    

    Ответ:

    content-type: text/xml
    
    <?xml version="1.0"?>
    <message subject="Subject" unread="true" id="1234" folder="inbox">
      Hi, this is the message.
    </message>
    
  • Чтобы отредактировать сообщение (например, пометить его как прочитанное и переместить в папку архива):

    POST /v1/inbox/messages/1234 HTTP/1.1
    Host: api.mydomain.com
    content-type: text/xml
    
    <?xml version="1.0"?>
    <message id="1234" unread="false" folder="archive" />
    

    Примечание:здесь я намеренно использую POST вместо PUT для указания частичного обновления.

Другие вещи, которые требуют повышенного внимания:

  • Гипермедиа-ответы и типы мультимедиа.Честно говоря, это лучше объяснить другим (например, книга REST In Practice или пример InfoQ Coffee Cup тех же авторов), но вкратце ваши ответы должны указывать клиенту, чтодругие действия могут быть возможны из ответа на их самый последний запрос и позволяют им обнаруживать весь API из одного URI.В качестве примера приведено описание папок коллекций выше.Если GET /v1/messages/1234 вернуло:

    <message subject="Subject" unread="true" id="1234" folder="inbox" >
      Message text here.
    
      <link rel="folder" href="http://api.mydomain.com/v1/folders/inbox" />
    </message>
    

    , тогда у клиента будет конкретный пример URI, чтобы попробовать OPTIONS, и хорошее представление о том, что там может быть.

  • Коды ответов и содержание: 200 OK очевидно.Ответьте 403 Forbidden, если пользователь не авторизован для просмотра определенного сообщения, 404 Not Found, если идентификатор сообщения не существует.Каждый раз, когда вы возвращаете ошибку, сообщайте клиенту, как исправить его запрос (если это возможно).

0 голосов
/ 28 сентября 2011

POST Роя полезен, когда сталкиваются с такими вопросами: http://roy.gbiv.com/untangled/2008/rest-apis-must-be-hypertext-driven

Следовательно: сфокусируйтесь на определении типа (ов) мультимедиа, а не на привязывании ваших клиентов к предопределенным наборам URI. Они не должны быть зарегистрированы, чтобы быть полезными, кстати.

Может быть, также увидеть http://www.nordsc.com/ext/classification_of_http_based_apis.html#http-type-one

0 голосов
/ 14 сентября 2011

Что касается чтения / непрочитанной части, я не думаю, что вам нужен пост.Я думаю, что вам нужно положить метод https://api.mydomain.com/v1/inbox/messageId/Read https://api.mydomain.com/v1/inbox/messageId/Unread

Сообщение необходимо при создании новой записи, и вы хотите обновить

Для части архива я согласен.Просто не забудьте вернуть результат для процесса архивирования.

...