2015-09-01 4 views
14

Вот пример, чтобы задать свой вопрос. У меня есть модель, которая содержит 'коробки', и у них есть REST конечной точки:Моделирование более сложной связи между объектами RESTful (поля и узлы)

/boxes, /boxes/{boxId}

Эта модель также содержит 'узлы':

/nodes, /nodes/{nodeId}

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

a quick visual example of boxes and nodes

Я пытаюсь определить, как эта модель в не-удивительно, RESTful образом. Я вижу пару способов сделать это. Но я не уверен, я должен использовать:

  1. Модель /borders в качестве полноправного типа объекта с его собственной конечной точки. В блоках указаны четыре границы (сверху, снизу, слева, справа). Имеют границы, ссылающиеся на список узлов. У узлов ссылаться на список границ.

  2. Модель /boxNodeRelationships со своей собственной конечной точкой и каждая из них относится к ящику, узлу и содержит поле «граница» (перечисление с четырьмя вариантами).

Оба являются похожими, а скорее «тяжелыми» для их целей. Альтернативный вариант должен быть немного более ad-hoc:

  1. Дайте в коробке список { border, node } объектов. Дайте узлам список объектов { box, border }. Эти объекты будут возвращены с GET вызовами и ожидаются от POST/PUT вызовов, но не будут полноценными типами с конечной точкой.

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

+0

Чтобы найти оптимальный способ моделирования API, вам необходимо понять варианты использования, для которых он, скорее всего, будет использоваться. – astreltsov

+0

@astr: Нам нужны всевозможные способы приблизиться к этим данным, действительно, например. получение всех узлов на границе, подключение всех ящиков к узлу, подключение всех ящиков к другому ящику и т. д. Поэтому мне интересно, какой из самых элегантных RESTful API предоставляет полный доступ к данным. – mhelvens

ответ

4

Я хотел бы создать 3 объектов:

  • Box
  • Border
  • Узел

И отношения:

  • Коробка может иметь п Границы
  • бордюра может иметь п Вершина

Таким образом, вы могли бы обратиться к ним:

Чтобы получить первый узел: /boxes/1/borders/1/nodes/1

Вы могли бы иметь некоторую логику:

if /boxes/1/borders contain /nodes/1 and /boxes/2/borders contain /borders/1 then they intersect 

И так далее ,

+0

Это действительно одна из возможностей, которые я рассматривал и перечислял в своем вопросе. Но в чем преимущество этого подхода по сравнению с другими подходами? Будет ли это «стандартным» в некотором смысле? – mhelvens

+0

Как вариант 2 против HATEOAS? Насколько я могу судить, это обычная техника (http://stackoverflow.com/q/6324547/681588) для отношений «многие ко многим». Недостатком варианта 1 является то, что «граница» является относительно бесполезной сущностью; дополнительное перенаправление только для решения этой проблемы. У всех их есть плюсы и минусы. Я надеялся на сравнительный анализ эксперта. – mhelvens

+0

На мой взгляд, отношения не должны отображаться как конечные точки веб-службы как отдельные объекты (/ boxNodeRelationship). Это не сущности как таковые. Это не бизнес-объекты. – ACV