2016-10-29 13 views
2

Я использую Spring Boot (созданный JHipster).Лучшая структура URL для отношения много-к-одному

У меня есть следующие услуги:

/api/market/ 
/api/market/:id 

и

/api/product/ 
/api/product/:id 

всех тех, кто с GET, PUT, POST и DELETE. Но мне нужно реализовать еще одну конкретную услугу.

Эти услуги должны возвращать все продукты на рынке X. Но для этого я решил передать в URL-адрес этот вызов: /api/product?marketID=1, но мне нужно будет сделать выбор в таблице рынка, а затем получить продукты (будет проще искать только в одной таблице на поле market_id).

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

ответ

3

Я хотел бы чтобы дать рекомендации о том, как структурировать ваш API, а затем предоставить возможный ответ на ваш вопрос.

Как правило, API RESTful следуют принципу множественного единства: учитывая все рынки (множественную часть), найдите рынок с идентификатором 5231422 (единственная часть). Обратите внимание, что в ваших URL-адресах с /api/{plural-noun}/{singular-identifier}. Так что ваш API будет в конечном итоге выглядит примерно так:

/api/products (all products in the system) 
/api/products/:productId (a single product in the system) 
/api/markets (all markets in the system) 
/api/markets/:marketId (a single market in the system) 

Чтобы ответить на ваш вопрос, то: я рекомендую вам использовать «русский штабелирования кукла» дизайн URL. Похоже, что ваш дизайн предполагает, что один рынок может содержать в себе несколько продуктов. Таким образом, вы можете найти этот вид URL немного яснее: /api/markets/:marketId/products, который извлекает все продукты на этом рынке.

+0

Спасибо за ответ! Вы и @ Грегг правы. Но у меня есть только один вопрос: мне нужно сделать выбор на рынках, а затем выбрать продукт? Или есть способ фильтровать в столбце market_id для продуктов? –

+0

У вашей продукции есть столбец для market_id? Если это так, просто запросите для всех продуктов, где market_id равен marketId в URL. Если у продуктов нет столбца market_id, вы можете создать способ связать продукты с рынками. – kevin628

+0

Мне пришлось сделать два «выбора», потому что я использую весну, поэтому мне пришлось делать «Market market = marketService.findOne (id);», а затем «productService.findByMarket (market);», я пытался избежать это, но я думаю, что нет другого пути –

2

Как правило, вы хотите, чтобы ваш URL был семантическим и навигационным. Так на основе того, что вы уже получили:

/api/market/:marketId/product

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

/api/markets/:marketId/products