Я знаю основной принцип дизайна Restful API. Я просто хочу знать, что я собираюсь сделать с помощью сопоставления URL-адресов Grails3 с несколькими поисковыми действиями.
Я создал приложение grails (3.3.9) с профилем rest-API. UrlMapping.groovy по умолчанию выглядит следующим образом.
class UrlMappings {
static mappings = {
delete "/$controller/$id(.$format)?"(action:"delete")
get "/$controller(.$format)?"(action:"index")
get "/$controller/$id(.$format)?"(action:"show")
post "/$controller(.$format)?"(action:"save")
put "/$controller/$id(.$format)?"(action:"update")
patch "/$controller/$id(.$format)?"(action:"patch")
"/"(controller: 'application', action:'index')
"500"(view: '/error')
"404"(view: '/notFound')
}
}
Пример класса домена
class ProductSanpshot {
String id
Float price
String name
}
class Order {
String id
String status
Float totalPrice
User createdBy
List<ProductSanpshot> ProductSanpshots
String remark
Date dateCreated
}
class User {
String id
String name
}
Пример контроллера
class OrderController {
def index() {
respond(Order.list())
}
def show() {
respond(Order.get(params.id))
}
}
На основе набора URL-сопоставлений, который удовлетворяет основному принципу дизайна Restful:
- Когда я получаю доступ / заказ, он возвращает список заказов.
- Когда я получаю доступ к / order / 1, он возвращает детали заказа со значением id 1.
Мои вопросы:
Обычно мы не получаем полный список заказов, но с другими параметрами.
Как я могу сопоставить URL-адрес для получения заказа в определенном ценовом диапазоне?
Нормальная реализация будет выглядеть так:
class OrderController {
def index() {
respond(Order.list())
}
def show() {
respond(Order.get(params.id))
}
def getByPriceRange() {
def minPrice = params.float("minPrice")
def maxPrice = params.float("maxPrice")
def result = Order.findAllByTotalPriceBetween(minPrice, maxPrice)
respond(result)
}
}
Я хотел бы получить доступ к order / getByPriceRange? MinPrice = 100 & maxPrice = 200.
Я знаю, что это может быть не так успокоительно.
При отображении URL Grails по умолчанию я получу ошибку 404. Он только отображает http, чтобы получить два действия для каждого контроллера. Индекс и шоу. И я не думаю, что мне нужно явно отображать действия каждого контроллера одно за другим.
get "/$controller(.$format)?"(action:"index")
get "/$controller/$id(.$format)?"(action:"show")
Другие сценарии:
- Получить заказы по статусу.
- Получите все снимки заказа.
- Обновить статус заказа
- Обновить примечание к заказу
Что я должен сделать с UrlMapping, чтобы удовлетворить эти потребности спокойным способом?
Заранее спасибо.