2012-11-19 12 views
18

In Scala come si crea un URL con parametri stringa di query a livello di codice?Scala: URL con parser di query e generatore DSL

Inoltre, come è possibile analizzare uno String contenente un URL con parametri di stringa di query in una struttura che consente di modificare i parametri della stringa di query a livello di programmazione?

risposta

13

la seguente libreria può aiutare a analizzare e costruire gli URL con parametri di stringa di query (Disclaimer: Questa è la mia propria biblioteca): https://github.com/lemonlabsuk/scala-uri

Esso fornisce un DSL per la costruzione degli URL con le stringhe di query:

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

È possibile analizzare un URI e ottenere i parametri in un Map[String,List[String]] in questo modo:

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

biblioteca di Teone sembra piuttosto n ghiaccio. Ma se vuoi solo un metodo di codifica veloce, ho questo. Tratta i parametri opzionali e riconosce anche JsValues ​​dal spray-json e li stampa in modo compatto prima della codifica. (Coloro che capita di essere le due cose che ho da preoccuparsi, ma si potrebbe facilmente estendere il blocco partita per altri casi si vuole dare un trattamento speciale a)

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 ha una efficient URI parser. L'utilizzo è in questo modo:

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

È possibile impostare i parametri di query in questo modo:

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

C'è un modo per utilizzare questo al di fuori di spray? Guardando la fonte sembra che sia abbastanza accoppiato in altre parti dello spray. – Falmarri

+0

Avrete solo bisogno del modulo ['spray-http'] (http://spray.io/documentation/1.2.0/spray-http/) che è piuttosto piccolo. Contiene solo il modello per richieste e risposte HTTP. Non contiene alcun codice server o client. – theon

+0

@theon come usiamo questo Spray Routing? Ecco il mio codice richiesta val: HttpRequest = Get (API) val gasdotto: Futuro [SendReceive] = {{ per Http.HostConnectorInfo (connettore, _) <- IO (HTTP)? Http.HostConnectorSetup (AppnexusSegmentService.AppnexusBaseUrl) } resa SendReceive (connettore) } Await.result (pipeline.flatMap {client => client.apply (richiesta)}, 15.seconds) – Anand

Problemi correlati