【发布时间】:2016-03-07 23:36:41
【问题描述】:
使用 Grails 3.1.3,我创建了一个 rest-api,以便我能够捕获 GET 请求,这些请求不仅可以查询一个参数,还可以在需要时获取多个参数。我不知道如何在 UrlMappings 文件中正确编码。以下是详细信息。
领域类:
class ProdDetail {
Integer pid
String title
String category
Integer year
}
其中一些在 BootStrap 中:
new ProdDetail(pid:'101', title:'No Highway', author:'Nevil Shute', category:'fiction', year:1948).save(failOnError:true)
new ProdDetail(pid:'214', title:'In the Country of Men', author:'Hisham Matar', category:'misery', year:2007).save(failOnError:true)
控制器:
protected List<ProdDetail> listAllResources(Map params) {
println params
try {
ProdDetail.where {
if (params.category && params.maxYear) {
category == params.category && year <= params.int('maxYear')
} else if (params.category) {
category == params.category
} else if (params.maxYear) {
year <= params.int('maxYear')
} else {
pid > 0
}
}.list()
} catch (Exception e) {
[]
}
}
网址映射:
static mappings = {
"/prodDetails"(resources:'prodDetail')
"/prodDetails/category/$category?"(controller:'prodDetail', action:'index')
"/prodDetails/yearUnder/$maxYear?"(controller:'prodDetail', action:'index')
// the line below is not right I think, what's the correct format?
"/prodDetails/combo/$category?&$maxYear?"(controller:'prodDetail', action:'index')
}
现在,这两个卷发在哪里起作用:
curl localhost:8080/prodDetails/category/misery
curl localhost:8080/prodDetails/yearUnder/2007
这一项未能进入控制器中所需的子句以检测两个参数:
curl localhost:8080/prodDetails/combo/?category=misery&maxYear=2007
它只检测到 'category' 而不是它认为是 'null' 的 'maxYear'。
请问这样的curl怎么办?
【问题讨论】:
-
如果您将 UrlMappings 发送到:
"/prodDetails/combo/$category"(controller:'prodDetail', action:'index')然后 curllocalhost:8080/prodDetails/combo/misery?maxYear=2007params 映射的内容是什么? -
刚试过。它返回两条记录(它不应该)。
println params的控制器输出为[controller:prodDetail, action:index, category:misery, max:10] -
等等,抱歉,您的建议成功了!它适用于我在 curl 命令中删除了
-i。知道为什么...我会再写一些,但现在想谢谢你。 -
是的,我错误地将 -i 留在 curl 命令中而没有正确的标题来应用您的建议(已编辑和修复)。所以,你的建议有效。但让我更进一步。如果我想对三个或更多参数进行查询,这种方法行不通,对吧?例如,假设我想查询类别、maxYear 和名称,那么 UrlMappings 中的条目会是什么样子? curl 命令类似于
curl localhost:8080/prodDetails/combo/misery?maxYear=2010&title=common。 -
这里,
println params' didn't see 'title', and swapping the & for ? gave this:[maxYear:2010?title=common, controller:prodDetail, action:index, category:misery, max:10]`。