2011-06-29 16 views
8

, ben formda bir HTTP isteğinin yanıtındanX-www-url-kodlanmış dizesini Lift kullanarak bir Haritaya [String, String] nasıl ayrıştırırım? Lift itibaren

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

bir dizi alıyorum.

Muhtemelen ultra önemsiz olsa da, bunu güzel bir Map[String, String] ürününe ayrıştıran Lift işlevini bulamıyorum. Herhangi bir yardım?

cevap

13

:

// 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

Çok teşekkür ederim David. Daha sonra bu snippetten kopyalayacağım. –

4

Bunun için herhangi bir Lift'in uygulamasını görmedim. Böyle bir şey ile bunu başarabilirsiniz:

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 

not: Eğer iyi biçimlenmiş dize sahip olduğunu varsayar. Kodunuzda dizenin iyi olup olmadığını kontrol etmelisiniz. Asansörün Req.scala itibaren

+1

Asansör, aynı şekilde kodlanmış istek parametrelerini ayrıştırdığından beri yapar. Evet, bunun için kendi ayrıştırıcınızı yazmak kolay görünüyor, ancak iyi test edilmiş ve köşe kutuları için de çalışıyor. Örneğin, çözümünüz haritaya koymadan önce kırılmış dizelerdeki 'URLEncoder.encode (_," UTF-8 ")' yi çağırmalıdır. –

+0

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

+0

Arıyorsunuz. ayrıştırmak, arka uç sunucumdan yaptığım bir talebe (aslında PayPal'a) yanıt olarak bana iade edilir. –

0

Bunu yardımcı olmak için birlikte küçük bir Scala kütüphanesi yaptı:

: Bir uri ayrıştırmak ve böylece gibi bir Map[String,List[String]] içine parametreleri alabilirsiniz

https://github.com/theon/scala-uri

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

Ayrıca sorgu dizeleri ile URL'ler oluşturmak için bir DSL vardır

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) 
İlgili konular