REST: Должен ли я перенаправить на URL-адрес версии объекта? - PullRequest
13 голосов
/ 02 апреля 2010

В настоящее время я работаю над службой REST. У этого сервиса есть разные версии, похожие на статьи в Википедии.

Теперь мне интересно, что я должен вернуть, если для

GET /article/4711

Должен ли я использовать (временное) перенаправление на текущую версию, например,

GET /article/4711/version/7

Или я должен вернуть текущую версию напрямую? Использование перенаправлений значительно упростит кэширование HTTP (с использованием Last-Modified), но имеет недостатки, которые имеет перенаправление (дополнительный запрос, «сложнее» реализовать). Поэтому я не уверен, что это хорошая практика.

Любые предложения, советы или опыт, чтобы поделиться?

(кстати: когда-нибудь пытались найти «REST Version»? Все, что вы получаете, это скорее о версии API, чем о сущностях. Поэтому, пожалуйста, потерпите меня, если это дубликат.)

Ответы [ 5 ]

11 голосов
/ 02 апреля 2010

Если вы рассматриваете версии как сущности (что, судя по всему, вы делаете), я бы предложил следующее:

GET /article/4711

возвращает список всех версий (и ссылки на них). Что делает /article/4711 контейнерной сущностью.

GET /article/4711/latest

возвращает содержимое последней версии. Возможно, вы захотите рассмотреть вопрос /version/latest, чтобы соответствовать приведенному ниже.

GET /article/4711/version/7

возвращает конкретную версию статьи.

2 голосов
/ 06 апреля 2010

Версии статей и гипертекст

Если вы действительно заинтересованы в том, чтобы сделать интерфейс RESTful, вам следует подумать, как это сделать в стиле HATEOS .

По моему мнению, это означало бы возвращение достаточного количества информации, чтобы пользователь мог перемещаться по списку ревизий вашей сущности. Если вы читаете это от Роя ...

"Интерфейс не нужно обнаруживать. Он определен прямо в гипертексте. Представление сообщает клиенту, как составить все переходы в следующее состояние приложения"

... вы почувствуете, как ваш GET /article/4711 должен возвращать достаточно информации

  1. Получить последнюю версию статьи

  2. Получить следующие / предыдущие версии

Вы будете знать, что лучше всего подходит для вашей модели, но в качестве указателя вы могли бы рассмотреть использование тегов

  <link rel="older"
        type="text/html"
        href="http://www.yourdomain.com/article/4711?version=6"/>

...

2 голосов
/ 02 апреля 2010

Возможно, вы захотите взглянуть на http://tools.ietf.org/html/draft-brown-versioning-link-relations.

Используя отношения ссылок CMIS и заголовок ссылки HTTP, вы можете сделать / article / 4711 самой последней и предоставить ссылку на версии, например, Ссылка: </ article / 4711 / version>; rel = история версий

2 голосов
/ 02 апреля 2010

Зависит от вашего предполагаемого поведения для GET /article/4711.Если предполагается, что он всегда указывает на последнюю версию, он должен возвращать последнюю версию напрямую.Перенаправление на определенную версию кажется проблематичным, поскольку вы полагаетесь на библиотеку пользователя / клиента, чтобы не посещать этот конкретный URL в будущем.Чтобы перевести в термины HTML, пользователь может добавить в закладки URL-адрес version/7 и удивиться, что теперь он получает доступ к более старой версии вместо обновленной версии, которую он первоначально вводил в адресную строку.

1 голос
/ 02 апреля 2010

Я думаю, что было бы более уместно вернуть список ревизий для:

GET /article/4711

Вы также можете иметь:

GET /article/4711/current

, который возвращает текущую версию напрямую.

...