2012-03-21 79 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(); 

這不需要任何額外的進口,應該直接從自舉控制器中工作。