Grails3 принцип сопоставления apl url для многократного запроса - PullRequest
0 голосов
/ 23 января 2019

Я знаю основной принцип дизайна 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, чтобы удовлетворить эти потребности спокойным способом?

Заранее спасибо.

1 Ответ

0 голосов
/ 23 января 2019

Я думаю, что вы не правы в этом вопросе, и URL все еще спокойный.Поскольку это запрос на получение, вы должны отправить свои параметры в URL.И это хорошо по нескольким причинам.Например, когда вы добавите этот URL в закладки, вы получите тот же результат с нужными данными без каких-либо проблем (особенно если этот URL ссылается на страницу).Для своих проектов я использую руководство Национального банка Бельгии api design .Это было самое подробное руководство, которое я могу найти, и оно мне действительно нравится.Вы можете видеть, что они используют параметры предела и смещения для разбивки на страницы и параметры сортировки для сортировки.В вашем примере это больше похоже на операцию поиска.Конечно, есть много подходов, и я знаю почти все из них, но мне действительно нравится их подход.Я использую FIQL для поиска.Об этом можно прочитать в разделе Поиск / Расширенный поиск.Я не хочу использовать другие параметры для поиска, поэтому я использую его следующим образом:

someUrl? Q = minPrice = gt = 10; maxPrice = lt = 50

Не удалось найти ни одной библиотеки, котораяМне нравится, поэтому я написал свой собственный парсер, чтобы решить эту проблему.Во всяком случае, это мои мнения, и, как я вижу, для них нет стандарта.Я надеюсь, что это поможет и бесплатно спросить что-нибудь.Ура !!

...