2013-12-10 1 views
0

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

У меня есть 3 сущности в моем домене: заказ, продавец и компания

Компания как небольшой компании, которая принадлежит другой компании (больше), как бренд. Пример: Zappos - это бренд Amazon.

Продавец - компания, которая может продавать продукцию на портале/сайте бренда, например: Market Place.

И, наконец, заказ может принадлежать бренду (например: Amazon или Zappos) или продавцу.

Я думал, в сущности заказа в качестве основного ресурса моего API:

GET order?status=NEW 
GET order/{id} 

Проблема: как я могу разработать свой API, например, чтобы получить все открытые заказы бренда или места Продавец?

Я не могу создать таким образом (ниже), потому что у меня будет два subresources под названием «порядок» с двумя Дифференц первичных ресурсов:

GET seller/{id}/order?status=NEW 
GET company/{id}/order?status=NEW 

Если я создаю таким образом (ниже) я не могу получить заказы фильтрации продавца или компании:

GET order?status=NEW 

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

Каков наилучший способ решить эту проблему?

ответ

1

Рассмотрим разделение данных в реляционной форме, так что вы можете сделать:

GET /orders 
GET /sellers 
GET /companies 

И:

GET /orders/{id} 
GET /sellers/{id} 
GET /companies/{id} 

Каждый из них будет вернуть то, что вы определили, что по умолчанию число строк, в порядке сортировки по умолчанию, или если указан идентификатор, эта конкретная строка.

Когда вам нужно построить реляционные запросы, вы можете сделать:

GET /orders/?status=new&brand=zappos 
GET /sellers/?status=new&company=amazon 
GET /sellers/?status=closed&company=amazon&limit=10 

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

UrlEncode это: status==new,date_created>1386652468

GET /orders/?ql=status%3D%3Dnew%2Cdate_created%3E1386652468 

Не зная ваш сопзЬ raints, я не могу рекомендовать это как лучший/единственный подход, но разделение данных подобно этому - лучшая практика API. Вы можете контролировать, какие бренды видны в зависимости от того, кто входит в систему. Что произойдет, если вам нужно, чтобы кто-то управлял несколькими брендами?