2016-06-30 5 views
2

Возьмите эту конструкцию из API:Означает ли это нарушение безгражданства API RESTful?

  • /articles/{id} - возвращает статью. Клиент предоставляет маркер в заголовке для их идентификации.
  • /updated-articles - Возвращает коллекцию статей, обновленных со времени последнего вызова клиента до этой конечной точки, и включает только статьи, которые ранее запрашивал этот клиент. Клиент предоставляет маркер в заголовке для их идентификации.

Вторая точка привязки не очень хорошо подходит для меня. Мотивацией дизайна этой второй точки является то, что клиенту не нужно отслеживать время их последних запросов. Разве это нарушает ограничение «безгражданства» API RESTful? Альтернативным подходом будет /updated-articles?since=YYYY-MM-DD, но для этого потребуется, чтобы клиенты помнили

+0

Почему бы не '/ articles? Updated_since = YYY-MM-DD' вместо этого? – arjabbar

+0

Как нить, это хорошо выглядит. Причина «почему бы нет» заключается в том, что клиенту необходимо будет отслеживать их значение для «YYYY-MM-DD», что противоречит требованиям. – edev

+0

Ваш клиент не должен быть без гражданства. Только ваше серверное приложение. – arjabbar

ответ

3

Ваш «токен» - это, в основном, идентификатор клиента, а факт запоминания даты последнего доступа - это сохранение состояния клиента на сервере.

Подумайте об этом: если вам нужно было увеличить свою услугу, вы могли бы просто подключить новый сервер, скопировать файлы своей службы и перенаправить с помощью циклического алгоритма на том или ином из двух серверов (без с которыми они обмениваются информацией)? Очевидно, нет, потому что вам понадобится ваша таблица tokens<->date of last consultation, разделяемая между двумя серверами. Так что нет, это определенно не без гражданства.

Кроме того, я не понимаю вашу точку:

Альтернативный подход будет/обновляемые-статьи, так как = YYYY-MM-DD , но это потребует клиентов помнить

?

Не будет ли токен требовать, чтобы клиент помнил? Напротив, таким способом будет RESTful, поскольку клиентское состояние (дата последней консультации) будет храниться на стороне клиента.

+0

Хотя я согласен с большей частью вашего комментария, я хочу привести [wikipedia] (https://en.wikipedia.org/wiki/Representational_state_transfer) по теме без гражданства: '... Состояние сеанса может быть передано сервер к другой службе, такой как база данных, которая поддерживает постоянное состояние в течение определенного периода времени и разрешает аутентификацию. «Соединения базы данных часто распределяются между несколькими серверами и, таким образом, позволяют серверу переводить текущее состояние на уровень БД, чтобы обеспечить дополнительную обработку сервера последующий запрос должен иметь доступ к состоянию. –

+0

«Не будет ли токен требовать, чтобы клиент помнил?». Я не уверен, что буду следовать. Токен имеет статическое значение с течением времени, это токен доступа. Клиент должен помнить значение для «ГГГГ-ММ-ДД». Бизнес-требования, переданные мне, заключались в том, что «клиенту не нужно отслеживать дату последнего вызова». – edev

0

В принципе, нет, я не думаю, что ваш второй ресурс нарушит безгражданство.

Я думаю, что это нормально, если ваш клиент отслеживает их собственную «обновленную» отметку времени. Ваш апи должен быть без гражданства. Клиент не должен быть без гражданства.

В любом случае клиент должен сохранять много состояния. Клиент будет устройством, центральным для одного пользователя и его конкретными потребностями. Он отвечает за отслеживание потребностей пользователя и текущего состояния. В этой ситуации кому-то придется хранить эту метку времени. Я думаю, что это должны быть ваши клиенты, а не ваш сервер.

Это только мое мнение.

Я нашел запись по истинному значению безгражданства, которое, как я думаю, также может принести вам пользу here.

0

Нам следует избегать создания конечных точек без связанного объекта.Так что вместо того, чтобы /updated-articles?since=<timestamp> лучший подход должен быть:

  • /articles?updated=true&since-last-request=true или
  • /articles?updated-since-last-request=true

Если предполагаемый результат должен влиять на всех клиентов. Значение каждой отметки времени запроса должно храниться на сервере. Или

  • /articles?updated-since=<timestamp>

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

Выбор между прежним или последним (или обоими) зависит от варианта использования. Но главное - избегать, создавая конечные точки без связанной сущности и имеющие специальные случаи, определяемые параметрами.

В качестве ориентира:

Конечных точек являются существительными, прилагательных являются параметрами и глаголов являются методами запроса HTTP

Это также означает просто ' GET/articles 'означает возвращение ВСЕ статей. Чтобы избежать злоупотреблений, вы можете выдать правильные коды 4xx в зависимости от случая.

+1

Я вижу, что вы говорите, кажется, имеет смысл, но не могли бы вы объяснить, как «/ updated-articles» имеют «не связанную сущность»? – edev

+1

@edev, что я имел в виду, состоит в том, что * статьи * являются сущностями, но * обновленными статьями * нет, они всего лишь подмножество первого. В моих проектах я избегаю создания таких подмножеств как конечных точек (сущностей) и предпочитаю их определять с помощью параметров. – flaviodesousa

Смежные вопросы