2012-11-19 15 views
18

In Scala Wie baue ich eine URL mit Abfrage String-Parameter programmgesteuert?Scala - URL mit Query String Parser und Builder DSL

Wie kann ich auch eine String analysieren, die eine URL mit Abfragezeichenfolgenparametern in einer Struktur enthält, die es mir ermöglicht, die Abfragezeichenfolgenparameter programmgesteuert zu bearbeiten?

Antwort

13

Die folgende Bibliothek kann Ihnen helfen, URLs mit Query-String-Parameter zu analysieren und bauen (Disclaimer: Dies ist meine eigene Bibliothek ist): https://github.com/lemonlabsuk/scala-uri

Es bietet eine DSL für URLs mit Query-Strings Aufbau:

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

Sie können eine uri analysieren und die Parameter in eine Map[String,List[String]] erhalten wie so:

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

Theons Bibliothek sieht ziemlich n Eis. Aber wenn Sie nur eine Quickie-Encode-Methode wollen, habe ich diese. Es behandelt optionale Parameter und erkennt auch JsValues ​​von spray-json und komprimiert sie vor dem Kodieren. (Diejenigen, passieren die beiden Dinge, die ich darum kümmern müssen, aber man konnte das Spiel Block für andere Fälle, die Sie leicht erweitern möchten, eine besondere Behandlung geben)

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

Spray hat eine sehr efficient URI parser. Die Nutzung ist in etwa so:

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

Sie die Abfrage params einstellen wie folgt:

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

Gibt es eine Möglichkeit, diese außerhalb der Spray zu benutzen? Wenn man die Quelle ansieht, sieht es so aus, als wäre sie in andere Teile von Spray eingekoppelt. – Falmarri

+0

Sie benötigen nur das ['spray-http'] (http://spray.io/documentation/1.2.0/spray-http/) Modul, das ziemlich klein ist. Es enthält nur das Modell für HTTP-Anfragen und Antworten. Es enthält keinen Server- oder Clientcode. – theon

+0

@theon Wie verwenden wir dieses Spray Routing? Hier ist mein Code val Anfrage: Httprequest = Get (api) val Pipeline: Zukunft [SendReceive] = { für { Http.HostConnectorInfo (Stecker, _) <- IO (Http)? Http.HostConnectorSetup (AppnexusSegmentService.AppnexusBaseUrl) } Ausbeute SendReceive (Stecker) } Await.result (pipeline.flatMap {client => client.apply (request)}, 15.seconds) – Anand