Grails3 Restful API URL映射原理,用于多个查询

时间:2019-01-23 11:45:16

标签: grails restful-url url-mapping

我知道Restful API设计的基本原理。我只想知道针对多个搜索操作使用Grails3 URL映射该怎么做。

我使用配置文件rest-API创建了grails(3.3.9)应用。默认的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))
    }
}

基于满足Restful设计基本原理的URL映射集:

  • 当我访问/ order时,它将返回订单列表。
  • 当我访问/ 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。

我知道这可能不会那么轻松。

对于默认的Grails网址映射,我会收到404错误。它仅将http get映射到每个控制器的两个动作。索引并显示。而且我认为我不必明确地逐个映射每个控制器的动作。

get "/$controller(.$format)?"(action:"index")
get "/$controller/$id(.$format)?"(action:"show")

其他情况是:

  • 按状态获取订单。
  • 获取订单的所有产品快照。
  • 更新订单状态
  • 更新订单备注

我应该如何使用UrlMapping来通过宁静的方式满足这些需求?

谢谢。

1 个答案:

答案 0 :(得分:0)

我认为您对此有误,并且该网址仍然静止。由于这是一个获取请求,因此您必须在url中发送参数。这样做有几个原因。例如,当您将该URL添加到书签时,您将获得与所需数据相同的结果,而不会出现任何问题(尤其是此URL引用页面时)。对于我的项目,我使用的是比利时国家银行的其余资金api design guide。这是我能找到的最详细的指南,我真的很喜欢。您可以看到他们正在使用limit和offset参数进行分页,并使用sort参数进行排序。在您的示例中,它更像是搜索操作。当然有很多方法,我几乎都知道它们,但是我真的很喜欢他们的方法。我使用FIQL进行搜索。您可以阅读有关“搜索/高级搜索”部分的内容。我不想使用其他参数进行搜索,因此我将其像这样使用:

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

找不到我喜欢的任何库,因此我编写了自己的解析器来解决该问题。无论如何,这些都是我的观点,并且我可以看到这些没有标准。希望对您有所帮助,并且可以免费提出任何问题。欢呼!!