Этот вопрос не зависит от языка. Давайте не будем беспокоиться о структурах или реализации, давайте просто скажем, что все может быть реализовано, и давайте рассмотрим REST API абстрактным образом. Другими словами: я строю структуру прямо сейчас, и я не видел никакого решения этой проблемы в любом месте.Как построить пересечение в REST Hypermedia API?
Вопрос
Как можно построить REST URL конечной точки для пересечения двух независимых путей REST, которые возвращают коллекции? Краткий пример: как пересечь /users/1/comments
и /companies/6/comments
?
Constraint
Все конечные точки должны вернуть единую модель данных объект или коллекцию объектов.
Imho это очень разумное ограничение, и все примеры API Hypermedia выглядят так, даже в draft-kelly-json-hal-07.
Если вы считаете, что это недопустимое ограничение или вы знаете лучший способ, сообщите мне об этом.
Пример
Так скажем, у нас есть приложение, которое имеет три типа данных: products
, categories
и companies
. Каждая компания может добавлять некоторые продукты на свою страницу профиля. При добавлении продукта они должны прикреплять категорию к продукту. Например, мы можем получить доступ к такой информации, как это:
GET /categories
будет возвращать коллекцию всех категорийGET /categories/9
возвратятся категории ид 9GET /categories/9/products
будет возвращать все продукты в категории ид 9GET /companies/7/products
будет возвращать все продукты добавлены в профиль страницу компании ид 7
Я пропустил _links
часть гипермедиа целиком, потому что это просто, например /
дает _links
до /categories
и /companies
и т. Д. Нам просто нужно помнить, что с помощью гипермедиа мы проходим график отношений.
Как написать URL-адрес, который будет возвращен: все продукты, принадлежащие компании (7) и имеющие категорию (9)? В других словах, как пересечь /categories/9/products
и /companies/7/products
?
Предполагая, что все конечные точки должны представлять собой ресурс модели данных или их коллекцию, я считаю, что это фундаментальная проблема API REST Hypermedia, поскольку при пересечении гипермедиа api мы пересекаем реляционный граф, идущий по одному пути, поэтому невозможно описать такие пересечение, потому что это поперечное сечение двух независимых графических путей.
Другими словами, я думаю, что мы не можем представлять два независимых пути только с одним путем.Обычно мы проходим по одному пути, как A->B->C
, но если у нас есть X->Y
и Z->Y
, и мы хотим, чтобы все Y
s, которые поступали из X
и Z
, тогда у нас есть проблема.
До сих пор мое предложение состоит в использовании строк запроса: /categories/9/products?intersect=/companies/9
, но можем ли мы сделать лучше?
Зачем мне это нужно?
Поскольку я создаю фреймворк, который будет автоматически генерировать API REST Hypermedia на основе отношений базы данных SQL. Вы можете подумать об этом как о транс-компиляторе URL-адресов для SELECT ... JOIN ... WHERE
запросов, но клиент API видит только Hypermedia, и клиент хотел бы иметь хороший способ делать перекрестки, как в примере.
Вы предлагаете клиенту нет волшебных идентификаторов 9 и 5? это не очень RESTful –