2012-03-21 9 views
38

Esiste un modo per accedere a tutti i parametri di richiesta, indipendentemente dal metodo HTTP? Ho riversato la documentazione e l'api senza trovare un modo in Play Framework 2.0.Request.params è andato in Play Framework 2.0

Ho una ricerca su un sito che accetta POST e GET. Il tracciamento personalizzato sul sito esamina tutti i parametri passati per determinare il modo corretto di memorizzare i dati di tracciamento.

Nel 1.2.x Riproduzione quadro, sono stato in grado di accedere ai parametri da una richiesta in un controller con

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

del gioco con il Framework 2.0, questo non è più il caso. Il Request non ha più il metodo params, solo queryString e queryString funziona solo con GET e non con POST.

Non è possibile definire ogni singolo parametro di tracciamento nell'azione Controller, sono dinamici.


UPDATE: Una possibile aggirare sta usando Body Parsers.

A seconda del tipo di contenuto della richiesta, viene utilizzato il parser appropriato, ad es. application/form-codifica URL vs application/json

Questa è la cruda mappa che combina parametri POST e GET parametri, con i parametri GET che prendono la precedenza.

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

Azione (parse.fooContentType) {...} è abbastanza utile, grazie per il collegamento Body parsers! – virtualeyes

+1

La tua risposta dovrebbe essere divisa in risposta, non come una modifica della domanda originale. –

+2

Speravo in una risposta corretta supportata dall'API invece della rozza correzione che ho funzionato in questo momento – mguymon

risposta

9

La documentazione di Play 2.0 non lo spiega molto bene. I parser per il corpo sono una soluzione accettabile, ma ho trovato che DynamicForm è molto più leggero e facile da usare.

La documentazione è disponibile here.

In particolare, lo DynamicForm.bindFromRequest() è un buon punto di partenza se si sta tentando di sostituire il vecchio Play 1.0 request.params.get().

+0

In 2.1.0 (possibilmente anche 2.0) uso form(). BindFromRequest(). Get ("param_key") per ottenere le singole richieste vars . – fabspro

+2

@fabspro dov'è il metodo form(), quale classe o pacchetto dovrei importare? – zjffdu

+3

Il metodo @zjffdu form() è stato spostato su play.data.Form.form() quindi è consigliabile utilizzarlo come Form.form(). https://github.com/playframework/Play20/blob/master/documentation/manual/Migration.md#playmvccontrollerform-renamed-to-playdataformform –

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

questo non richiede importazioni aggiuntive e dovrebbe funzionare direttamente dal controller bootstrap.

Problemi correlati