以DRY方式为每个请求验证RESTful URL

时间:2015-03-18 20:06:02

标签: validation rest grails

我们的Grails 2.4.4应用程序始终使用RESTful URL。给出以下URL:

/存储/ 123 /产品/ 456

我想验证存在ID为123的商店,如果没有,则在每次向产品控制器发出请求时重定向到404。我不想在每个操作方法中放置存储查找代码,也不想创建控制器基类,因为那时我必须在每个操作方法中放置一个方法调用。

这可以用拦截器以某种方式完成吗?

2 个答案:

答案 0 :(得分:1)

Grails 3.0中引入了拦截器。在Grails 2.4.4中你需要filters

before = { }是这里需要的。

另请查看默认情况下哪些变量可用于过滤器的文档(例如:params,request,response等)。如果仍然不清楚,我可以添加一个答案作为例子。但我希望文档能够自我解释。作为一个例子,我会这样做

class EntityCheckFilters {
    def filters = {
        storeExistCheck( controller:'product' ) {
            before = {
               if ( !params.storeId || !Store.exists( params.sotreId as Long ) ) {
                    response.sendError(404)
                    // or for example if you have a separate action to handle 404
                    // redirect(action: 'handle404')

                    // this is important, 
                    // because we do not want to pass through with the original call
                    return false 
               }
            }
        }
    }
}

答案 1 :(得分:0)

我认为您可以使用以下方式执行此操作:

  1. 网址映射
  2. 过滤器
  3. 但我不认为在URL Mapping中设置逻辑(检查是否存在具有给定id的有效商店)是个好主意,所以最好使用Filters。

    所以你的网址映射将如下所示:

    "/stores/$storeId/products/$productId" (controller = "product")
    

    你的过滤器:

    class YourFilterNameFilters {
    
    
        def filters = {
            secureReports(controller:'*', action:'*') {
                before = {
    
                   if(parmas.controller == "product" && params.storeId){
                         Store store = Store.get(params.sotreId)
                        if(!store){
                            response.sendError(404)
                         }
                     }
               }
          }
    }