2011-06-29 5 views

Odpowiedz

13

od wyciągu za Req.scala:

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

Dziękuję bardzo David. Następnie skopiuję z tego fragmentu. –

4

Nie widziałem żadnej implementacji windy. Można to osiągnąć przy czymś takim:

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 

uwaga: zakłada, że ​​masz dobrze uformowany ciąg. W swoim kodzie powinieneś prawdopodobnie sprawdzić, czy napis jest w porządku.

+1

Winda robi to, ponieważ analizuje parametry żądania, które są zakodowane w ten sam sposób. Tak, napisanie własnego parsera na to wygląda łatwo, ale chcę takiego, który jest dobrze przetestowany i działa również w przypadku narożników. Na przykład, twoje rozwiązanie powinno wywołać 'URLEncoder.encode (_," UTF-8 ")' na rozbitych łańcuchach przed umieszczeniem ich na mapie. –

+0

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

+0

Dzięki, ale w rzeczywistości nie, ponieważ ciąg znaków do parsowania jest zwracany do mnie jako odpowiedź na żądanie, które zrobiłem z mojego serwera zaplecza (w rzeczywistości do PayPala). –

0

ułożyła małą bibliotekę Scala pomóc to zrobić: https://github.com/theon/scala-uri

Można analizować URI i inne parametry w Map[String,List[String]] tak:

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

posiada również DSL do budowania adresów URL z ciągów zapytań:

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)