2012-03-21 54 views
38

有没有办法访问所有的请求参数,而不管HTTP方法?我没有在Play Framework 2.0中找到方法,而是倾注了文档和API。Request.params在Play Framework 2.0中没有了

我在接受POST和GET的网站上进行搜索。网站上的自定义跟踪会检查传入的所有参数,以确定存储跟踪数据的正确方式。

在Play框架1.2.x的,我能够从请求访问参数在一个控制器,具有

request.params.get("keywords") 
request.params.get("location") 
request.params.all() 

随着播放2.0,这不再是这种情况。 Request不再有方法params,只有queryString和queryString只能使用GET而不是POST。

在Controller Action中定义每个可能的跟踪参数是不可行的,它们是动态的。


UPDATE:一个可能的解决办法是使用Body Parsers

根据请求的内容类型,使用适当的分析器,例如, 应用/表单网址编码 VS 应用/ JSON

这是粗地图结合POST参数和GET参数,并优先GET参数。

val params: collection.mutable.Map[String, Seq[String]] = collection.mutable.Map() 
params ++= request.body.asFormUrlEncoded.getOrElse[Map[String, Seq[String]]] { Map.empty } 
params ++= request.queryString 
+1

Action(parse.fooContentType){...}非常有用,感谢Body解析器链接! – virtualeyes 2012-05-29 12:02:49

+1

您的答案应该作为答案拆分出来,而不是作为原始问题的编辑。 – 2012-07-10 14:59:35

+2

我希望得到API支持的正确答案,而不是我现在正在工作的原始修复程序 – mguymon 2012-07-10 18:48:15

回答

9

Play 2.0文档没有很好地解释这一点。身体解析器是一个可以接受的解决方案,但我发现DynamicForm更轻巧和用户友好。

该文档可以找到here

特别是,DynamicForm.bindFromRequest()是一个很好的开始,如果你试图取代旧的Play 1.0 request.params.get()

+0

在2.1.0(可能2.0以及)我使用form()。bindFromRequest()。get(“param_key”)来获得个别请求变量。 – fabspro 2013-02-12 10:52:20

+2

@fabspro where form()方法,我应该导入哪个类或包? – zjffdu 2013-03-17 04:46:48

+3

@zjffdu form()方法移动到play.data.Form.form(),所以你应该使用它作为Form.form()。 https://github.com/playframework/Play20/blob/master/documentation/manual/Migration.md#playmvccontrollerform-renamed-to-playdataformform – 2013-04-02 07:49:00

4
ctx()._requestHeader().getQueryString("q").get(); 

这不需要任何额外的进口,应该直接从自举控制器中工作。