2013-11-20 12 views
5

Sto rifattorizzando un progetto per utilizzare Play Framework anziché Scalatra e sto avendo problemi con i parametri di query contenenti il ​​punto e virgola, ad es. /url? Filter = filter1: val1; filter2: val2 viene mappato su filter = "filter1: val1; filter2: val2" in Scalatra, ma viene mappato su filter = "filter1: val1" in Play Framework. L'unica soluzione che ho trovato, Escape semicolon route playframework 2.0.2, suggerisce l'utilizzo di un'espressione regolare per acquisire l'intero parametro, ma questo sembra essere applicabile solo ai parametri del percorso e non ai parametri di query: uno dei miei requisiti è che non posso cambiare il modo in cui il front-end chiama l'api, cioè non posso cambiare un parametro di query in un parametro path.Riproduci punto e virgola parsing nei parametri di query

Come posso dire a Play di non analizzare il punto e virgola nei parametri di query, ovvero restituire "filter1; filter2" anziché "filter1"?

Posso analizzare manualmente i parametri della query utilizzando un'espressione regolare su "request.rawQueryString", ma preferirei evitare questo, se possibile.

+0

Hai mai trovare una soluzione a questo? Corriamo nello stesso identico problema. – cdeszaq

+0

@cdeszaq Vedere la mia risposta qui sotto –

risposta

3

La soluzione siamo andati con era quello di analizzare i parametri di query utilizzando una classe implicita, che non era così oneroso come ho pensato che sarebbe stato

implicit class ParsedRawQueryString[+T](req: Request[T]) { 

    import java.net.URLDecoder.decode 

    def parsedRawQueryString = (for { 
    s <- decode(req.rawQueryString, "UTF-8").split('&') if s.contains('=') 
    } yield { 
    val index = s.indexOf('=') 
    s.substring(0, index) -> s.substring(index + 1) 
    }).toMap 
} 

def route = Action { 
    request => 
    val queryParams = request.parsedRawQueryString 
} 
Problemi correlati