如何验证请求参数以确保它们包含必需的参数并且不包括不支持的参数?

时间:2013-12-18 09:39:21

标签: ruby api sinatra

这尤其适用于使用RESTRuby构建的Sinatra API。

手动检查以确保所需的参数不是零是很容易的。并且很容易迭代一个平坦的参数哈希,看看它是否允许在白名单中。

然而,当params散列也包含哈希时,它变得更加困难。

我想到的一种处理方法是将params散列转换为JSON并使用库来对JSON架构进行验证。

我遇到了sinatra-param宝石,但我没有机会看到它是否可以验证子哈希或检查不支持的参数。

编辑:另一种可能更有意义的方法是将params直接传递给模型(我正在使用DataMapper)并使用其验证和错误而不是重写验证。

1 个答案:

答案 0 :(得分:1)

如果你的每个路由都采用相同的4个参数(IE :one, :two, :three, :four),你可以设置一个前置过滤器,将这四个参数的数组存储为之前的实例变量(这是所有路线均可访问)并使用名为all?的类Enumerable中的性感小方法:

before do
  @base_params = [params[:one], params[:two], params[:three], params[:four]]

  unless @base_params.all?
    redirect '/error_route'
  end
end 
仅当“收藏集”中的所有值都不是Enumerable#all?false时,

nil才会返回true。可以找到文档here for Ruby 1.9

另外,如果你发现你有不同的参数集,你可以创建一个哈希而不只是一个@base_params数组,其中键是request.request_method的字符串值:

before do

  @base_params = {"GET"  => [params[:one], params[:two], params[:three], params[:four]], 
                  "POST" => [params[:five], params[:six], params[:seven]],
                  "PUT"  => [params[:one], params[:five], params[:six]]}

  unless @base_params[request.request_method].all?
    redirect '/error_route'
  end
end