RESTful API design (подключение ресурсов) - PullRequest
4 голосов
/ 29 июля 2011

Я разрабатываю API для своего веб-проекта (PHP), но сталкиваюсь с проблемами при моделировании отношений между ресурсами со свойствами.Я хотел бы получить некоторую информацию о том, как действовать.

Ресурсы:

  • Пользователи.
    • Идентификатор.
    • Имя.
    • Собаки (отношения).
      • Идентификатор.
      • Частный (да или нет).
  • Собаки.
    • Идентификатор.
    • Имя.

Отношения:

  • Многие ко многим.
    • У одного пользователя может быть много собак.
    • Одна собака может принадлежать многим пользователям.
  • Отношения могут быть частными или общедоступными.

Как бы вы хотели обновить свойство private для отношений?

Сейчас вам нужно отправить запрос PUT в ... / api / users / {userId}, включаяВСЕ отношения этого пользователя, включая обновленное свойство:

(имя может быть NULL -> нет обновлений)

  • Dogs:
    • Dog.
      • ID: DogA.
      • Личное: Да.
    • Собака.
      • ID: DogB.
      • Личное: Нет. (Обновлено)

Я не чувствую себя комфортнос этим подходом, так как я считаю, что только информация, которая была изменена, должна быть отправлена ​​для обновления.Поэтому моя идея сейчас заключается в том, чтобы добавить поддержку только отправки обновленных отношений в ... / api / users / {userId}:

  • Dogs.
    • Собака.
      • ID: DogB.
      • Личное: Нет. (Обновлено)

Прежде чем приступить к работе, ябыл бы очень признателен за некоторые отзывы.Может быть, есть и другие лучшие способы обработки отношений между ресурсами?

1 Ответ

1 голос
/ 29 июля 2011

Это нарушит принцип идемпотентности REST-сервисов. Это означает, что вы должны иметь возможность отправить одну и ту же операцию дважды, не меняя ресурс при второй операции.

Я бы рассматривал отношение как отдельный ресурс: Создать / обновить будет PUT ../api/users/{userId}/dogs/{dogId} с частным: Да / Нет. Удаление отношения будет обработано DELETE ../api/users/{userId}/dogs/{dogId}.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...