Используя 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) {
[]
}
}
UrlMappings:
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
Он просто определяет «категорию», но не «maxYear», который он считает «нулевым».
Как я могу обслужить такой curl
, пожалуйста?