2011-06-29 11 views
8

लिफ्ट से, मैं प्रपत्रलिफ्ट का उपयोग करके मैप [स्ट्रिंग, स्ट्रिंग] में एक्स-www-url-encoded स्ट्रिंग को कैसे पार्स कर सकता हूं?

TOKEN=EC%2d454178600K772032D&TIMESTAMP=2011%2d06%2d29T13%3a10%3a58Z&CORRELATIONID=cbd56e97cad38&ACK=Success&VERSION=64&BUILD=1936884 
एक HTTP अनुरोध की प्रतिक्रिया से

की एक स्ट्रिंग हो रही है।

हालांकि यह शायद अति-मामूली है, लेकिन मुझे लिफ्ट फ़ंक्शन नहीं मिल रहा है जो इसे Map[String, String] में पार्स करता है। कोई मदद?

उत्तर

13

लिफ्ट के 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

बहुत बहुत धन्यवाद डेविड। मैं फिर इस स्निपेट से कॉपी करूंगा। –

4

मैंने इसके लिए किसी भी लिफ्ट के कार्यान्वयन को नहीं देखा है। आप कुछ इस तरह से इस लक्ष्य को हासिल कर सकते हैं:

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 

ध्यान दें: यह मान लिया गया है, तो आप एक अच्छी तरह से गठित स्ट्रिंग है। आपके कोड में आपको शायद यह जांचना चाहिए कि स्ट्रिंग ठीक है या नहीं।

+1

लिफ्ट यह करता है क्योंकि यह पैरामीटर अनुरोध पैरामीटर को पार करता है, जो उसी तरह एन्कोड किए जाते हैं। हां, इसके लिए अपना खुद का पार्सर लिखना आसान दिखता है, लेकिन मुझे वह चाहिए जो अच्छी तरह से परीक्षण किया गया हो और कोने के मामलों के लिए भी काम करता हो। उदाहरण के लिए, आपके समाधान को मानचित्र में डालने से पहले टूटे हुए तारों पर 'URLEncoder.encode (_," UTF-8 ") को कॉल करना चाहिए। –

+0

आप शायद http://scala-tools.org/mvnsites/liftweb-2.0/framework/scaladocs/net/liftweb/http/provider/HTTPRequest.html#params – folone

+0

धन्यवाद, लेकिन वास्तव में नहीं, स्ट्रिंग के बाद से देख रहे हैं मेरे बैक एंड सर्वर (वास्तव में पेपैल में) से किए गए अनुरोध के जवाब के रूप में पार्स को मेरे पास वापस कर दिया गया है। –

0

मैं एक साथ एक छोटा सा स्काला पुस्तकालय डाल ऐसा करने में मदद करने के: https://github.com/theon/scala-uri

आप एक uri पार्स और एक Map[String,List[String]] इसलिए की तरह में पैरामीटर प्राप्त कर सकते हैं:

+०१२३५१६४१०६१:
val uri = parseUri("http://example.com?one=1&two=2").query.params 

यह भी क्वेरी स्ट्रिंग के साथ यूआरएल के निर्माण के लिए एक डीएसएल है

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) 
संबंधित मुद्दे