Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/grails/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Grails上RESTful接口的搜索实现_Rest_Grails - Fatal编程技术网

Grails上RESTful接口的搜索实现

Grails上RESTful接口的搜索实现,rest,grails,Rest,Grails,我正在Grails2.1.1应用程序上构建RESTful接口。我应该如何实现搜索操作?我不想重复大量的代码,这是我目前的想法所需要的 服务器结构是非常普通的GrailsMVC:域类表示数据,控制器提供接口,服务具有业务逻辑。我在控制器中使用命令对象进行数据绑定,但在服务方法中不使用。客户端是一个web UI。我的目标是创建如下搜索URL: /cars/?q=generic+query+from+all+fields /cars/?color=red&year=2011 (我知道关于这类

我正在Grails2.1.1应用程序上构建RESTful接口。我应该如何实现搜索操作?我不想重复大量的代码,这是我目前的想法所需要的

服务器结构是非常普通的GrailsMVC:域类表示数据,控制器提供接口,服务具有业务逻辑。我在控制器中使用命令对象进行数据绑定,但在服务方法中不使用。客户端是一个web UI。我的目标是创建如下搜索URL:

/cars/?q=generic+query+from+all+fields
/cars/?color=red&year=2011
(我知道关于这类带有查询字符串的URL的RESTfull的争论:。虽然我认为这是最适合我的模型,但如果它们能使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") {
        // ...
    }
}

您可以从
params
获取所有这些参数,如:

result = carService.search(params.color, params.year as Integer, cmd.max, cmd.offset, cmd.order, cmd.sort)
params
map的所有值都是字符串,因此您应该在控制器中将其转换为适当的数据结构(最好检查
params.year
是否为实际数字)


更新

如果不想编写字段名,可以将其作为映射传递:

resutl = carService.search(params)
在哪里

List<Car> search(Map params)
列表搜索(映射参数)

我希望传递搜索方法的所有字段,而不在方法签名中显式写入它们。如果服务方法签名具有字段,则在更改域对象中的字段时,我必须更改服务接口。我也可以将REST接口命令对象用于服务接口,但感觉不对。似乎将参数映射传递给服务方法是最简单的方法。我的服务方法签名现在是:
List search(params=null,max=10,offset=0,order=“asc”,sort=“id”)
I删除搜索不需要的控制器参数:
params?.remove(“action”)
稍后我从我要在搜索中使用的param成员中构建一个
findAllWhere()
查询。
List<Car> search(Map params)