我知道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映射集:
我的问题是: 通常,我们只是没有获得订单的完整列表,而是使用不同的参数。 如何映射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来通过宁静的方式满足这些需求?
谢谢。
答案 0 :(得分:0)
我认为您对此有误,并且该网址仍然静止。由于这是一个获取请求,因此您必须在url中发送参数。这样做有几个原因。例如,当您将该URL添加到书签时,您将获得与所需数据相同的结果,而不会出现任何问题(尤其是此URL引用页面时)。对于我的项目,我使用的是比利时国家银行的其余资金api design guide。这是我能找到的最详细的指南,我真的很喜欢。您可以看到他们正在使用limit和offset参数进行分页,并使用sort参数进行排序。在您的示例中,它更像是搜索操作。当然有很多方法,我几乎都知道它们,但是我真的很喜欢他们的方法。我使用FIQL进行搜索。您可以阅读有关“搜索/高级搜索”部分的内容。我不想使用其他参数进行搜索,因此我将其像这样使用:
someUrl?q = minPrice = gt = 10; maxPrice = lt = 50
找不到我喜欢的任何库,因此我编写了自己的解析器来解决该问题。无论如何,这些都是我的观点,并且我可以看到这些没有标准。希望对您有所帮助,并且可以免费提出任何问题。欢呼!!