2011-06-29 10 views
8

De Levante, estoy recibiendo una cadena de la forma¿Cómo se analiza una cadena codificada en x-www-url en un Mapa [Cadena, Cadena] usando Levantamiento?

TOKEN=EC%2d454178600K772032D&TIMESTAMP=2011%2d06%2d29T13%3a10%3a58Z&CORRELATIONID=cbd56e97cad38&ACK=Success&VERSION=64&BUILD=1936884 

partir de la respuesta de una petición HTTP.

Aunque es probablemente muy trivial, no puedo encontrar la función de elevación que analiza esto en un buen Map[String, String]. ¿Alguna ayuda?

Respuesta

13

De Req.scala de elevación:

// calculate the query parameters 
lazy val queryStringParam: (List[String], Map[String, List[String]]) = { 
    val params: List[(String, String)] = 
    for { 
     queryString <- request.queryString.toList 
     nameVal <- queryString.split("&").toList.map(_.trim).filter(_.length > 0) 
     (name, value) <- nameVal.split("=").toList match { 
     case Nil => Empty 
     case n :: v :: _ => Full((urlDecode(n), urlDecode(v))) 
     case n :: _ => Full((urlDecode(n), "")) 
     }} yield (name, value) 

     val names: List[String] = params.map(_._1).distinct 
    val nvp: Map[String, List[String]] = params.foldLeft(Map[String, List[String]]()) { 
    case (map, (name, value)) => map + (name -> (map.getOrElse(name, Nil) ::: List(value))) 
    } 

    (names, nvp) 
} 
+1

Muchas gracias David. Luego copiaré de este fragmento. –

4

No he visto ninguna implementación de Lift para eso. Usted puede lograr esto con algo como esto:

val input = "TOKEN=EC%2d454178600K772032D&TIMESTAMP=2011%2d06%2d29T13%3a10%3a58Z&CORRELATIONID=cbd56e97cad38&ACK=Success&VERSION=64&BUILD=1936884" 
val res = input.split('&') map { str => 
    val pair = str.split('=') 
    (pair(0) -> pair(1)) 
} toMap 

nota: se asume, que tiene una cadena bien formada. En tu código probablemente deberías verificar si la cadena está bien.

+1

Lift lo hace, ya que analiza los parámetros de solicitud, que se codifican de la misma manera. Sí, escribir tu propio analizador para eso parece fácil, pero quiero uno que esté bien probado y que también funcione para los casos de esquina. Por ejemplo, su solución debe llamar 'URLEncoder.encode (_," UTF-8 ")' en las cadenas separadas antes de ponerlas en el mapa. –

+0

Probablemente esté buscando http://scala-tools.org/mvnsites/liftweb-2.0/framework/scaladocs/net/liftweb/http/provider/HTTPRequest.html#params – folone

+0

Gracias, pero en realidad no, ya que la cadena para analizar se me devuelve como respuesta a una solicitud que hice desde mi servidor back-end (a PayPal, en realidad). –

0

que arme una pequeña biblioteca Scala para ayudar a hacer esto: https://github.com/theon/scala-uri

Puede analizar un URI y obtener los parámetros en un Map[String,List[String]] así:

val uri = parseUri("http://example.com?one=1&two=2").query.params 

también tiene una conexión DSL para la construcción de URL con cadenas de consulta:

val uri = "http://example.com" ? ("one" -> 1) & ("two" -> 2) 
0
scala> val queryParams = "a=4&b=5" 
scala> queryParams.split("&").toList.map(_.trim).filter(_.length > 0).flatMap(x => { 
    val s = x.split('=') 
    Map[String, String](s(0) -> s(1)) 
}).toMap[String, String] 

res0: scala.collection.immutable.Map[String,String] = Map(a -> 4, b -> 5) 
Cuestiones relacionadas