我正在 Grails 2.1.1 应用程序上构建一个 RESTful 接口。我应该如何实现搜索操作?我不想重复我目前的想法需要的大量代码。
服务器结构很正常 Grails-MVC:领域类代表数据,控制器提供接口,服务具有业务逻辑。我在控制器中使用命令对象进行数据绑定,而不是在服务方法上。客户端是一个 Web UI。我的目标是拥有这样的搜索网址:
/cars/?q=generic+query+from+all+fields
/cars/?color=red&year=2011
(我知道关于这种带有查询字符串的 URL 的 RESTfulness 的争论:RESTful URL design for search。虽然我认为这是我的目的的最佳模型,但如果他们制作 API 和实现更好。)
正如您从下面的代码示例中看到的那样,我的问题在于第二种 URL,即特定于字段的搜索。为了对具有大量字段的多个域类实现这种搜索操作,我的方法签名会爆炸。
可能有一种“Groovy 方式”可以做到这一点,但我在更精细的 Groovy 技巧中仍然有点 n00b :)
领域:
class Car {
String color
int year
}
控制器:
class CarsController {
def carService
def list(ListCommand cmd) {
def result
if (cmd.q) {
result = carService.search(cmd.q, cmd.max, cmd.offset, cmd.order, cmd.sort)
}
else {
result = carService.search(cmd.color, cmd.year, cmd.max, cmd.offset, cmd.order, cmd.sort)
}
render result as JSON
}
class ListCommand {
Integer max
Integer offset
String order
String sort
String q
String color // I don't want this field in command
int year // I don't want this field in command
static constraints = {
// all nullable
}
}
// show(), save(), update(), delete() and their commands clipped
}
服务:
class CarService {
List<Car> search(q, max=10, offset=0, order="asc", sort="id") {
// ...
}
List<Car> search(color, year, max=10, offset=0, order="asc", sort="id") {
// ...
}
}
网址映射:
class UrlMappings {
static mappings = {
name restEntityList: "/$controller"(parseRequest: true) {
action = [GET: "list", POST: "save"]
}
name restEntity: "/$controller/$id"(parseRequest: true) {
action = [GET: "show", PUT: "update", POST: "update", DELETE: "delete"]
}
}
}