2012-11-19 18 views
18

के साथ यूआरएल स्कैला में मैं प्रोग्राम स्ट्रिंग पैरामीटर के साथ प्रोग्रामिंग के साथ एक यूआरएल कैसे बना सकता हूं?स्कैला - क्वेरी स्ट्रिंग पार्सर और बिल्डर डीएसएल

मैं String को एक स्ट्रक्चर में क्वेरी स्ट्रिंग पैरामीटर के साथ एक यूआरएल युक्त कैसे पार्स कर सकता हूं जो मुझे प्रोग्राम स्ट्रिंग पैरामीटर को प्रोग्रामेटिक रूप से संपादित करने की अनुमति देता है?

उत्तर

13

निम्नलिखित पुस्तकालय मदद कर सकते हैं पार्स और क्वेरी स्ट्रिंग पैरामीटर वाले URL निर्माण

val uri = "http://example.com" ? ("one" -> 1) & ("two" -> 2) 
: https://github.com/lemonlabsuk/scala-uri

यह क्वेरी स्ट्रिंग के साथ यूआरएल के निर्माण के लिए एक डीएसएल प्रदान करता है: (अस्वीकरण: यह मेरे अपने पुस्तकालय है)

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

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

थियोन के पुस्तकालय लग रहा है सुंदर n बर्फ। लेकिन अगर आप सिर्फ एक क्विक एन्कोड विधि चाहते हैं, तो मेरे पास यह है। यह वैकल्पिक पैरामीटर से संबंधित है, और spray-json से JsValues ​​को भी पहचान लेगा और एन्कोडिंग से पहले कॉम्पैक्ट प्रिंट करेगा। (उन दो बातें मैं के बारे में चिंता करने की ज़रूरत होने के लिए होता है, लेकिन आप आसानी से आप के लिए विशेष हैंडलिंग देना चाहता हूँ अन्य मामलों के लिए मैच ब्लॉक का विस्तार कर सकता है)

import java.net.URLEncoder 
def buildEncodedQueryString(params: Map[String, Any]): String = { 
    val encoded = for { 
    (name, value) <- params if value != None 
    encodedValue = value match { 
     case Some(x:JsValue) => URLEncoder.encode(x.compactPrint, "UTF8") 
     case x:JsValue  => URLEncoder.encode(x.compactPrint, "UTF8") 
     case Some(x)   => URLEncoder.encode(x.toString, "UTF8") 
     case x    => URLEncoder.encode(x.toString, "UTF8") 
    } 
    } yield name + "=" + encodedValue 

    encoded.mkString("?", "&", "") 
} 
15

स्प्रे एक बहुत efficient URI parser है। प्रयोग इसलिए की तरह है:

import spray.http.Uri 
val uri = Uri("http://example.com/test?param=param") 

तुम इतनी तरह क्वेरी पैरामीटर सेट कर सकते हैं:

uri withQuery ("param2" -> "2", "param3" -> 3") 
+0

वहाँ स्प्रे के इस बाहर का उपयोग करने के लिए एक रास्ता है? स्रोत को देखते हुए ऐसा लगता है कि यह स्प्रे के अन्य हिस्सों में काफी सुंदर है। – Falmarri

+0

आपको केवल ['स्प्रे-http'] (http://spray.io/documentation/1.2.0/spray-http/) मॉड्यूल की आवश्यकता होगी जो बहुत छोटा है। इसमें केवल HTTP अनुरोधों और प्रतिक्रियाओं के लिए मॉडल शामिल है। इसमें कोई सर्वर या क्लाइंट कोड नहीं है। – theon

+0

@theon हम इस स्प्रे रूटिंग का उपयोग कैसे करते हैं? यहाँ मेरी कोड वैल अनुरोध है: HttpRequest = प्राप्त करें (एपीआई) वैल पाइपलाइन: भविष्य [SendReceive] = { के लिए { Http.HostConnectorInfo (कनेक्टर, _) <- आईओ (HTTP)? Http.HostConnectorSetup (AppnexusSegmentService.AppnexusBaseUrl) } उपज sendReceive (कनेक्टर) } Await.result (pipeline.flatMap {ग्राहक => client.apply (अनुरोध)}, 15.seconds) – Anand

0

डिस्पैच अभी तक का उल्लेख नहीं किया गया है।

http://dispatch.databinder.net/Dispatch.html

val myRequest = "http://somehost.com"/"some"/"path" <<? Map("id" -> "12345") 
+0

हाय @ आशेलैंड! यूआरएल टूटा हुआ प्रतीत होता है –

संबंधित मुद्दे