it-swarm.com.de

Scala - URL mit Query String Parser und Builder DSL

Wie kann ich in Scala programmgesteuert eine URL mit Abfragezeichenfolge-Parametern aufbauen?

Wie kann ich auch eine String mit einer URL mit Abfragezeichenfolgeparametern in eine Struktur parsen, die es mir ermöglicht, die Abfragezeichenfolgeparameter programmgesteuert zu bearbeiten?

18
theon

Die folgende Bibliothek kann Ihnen beim Analysieren und Erstellen von URLs mit Abfragezeichenfolgenparametern helfen (Haftungsausschluss: Dies ist meine eigene Bibliothek): https://github.com/lemonlabsuk/scala-uri

Es bietet eine DSL zum Erstellen von URLs mit Abfragezeichenfolgen:

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

Sie können einen URI analysieren und die Parameter wie folgt in einen Map[String,List[String]] eingeben:

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

Spray hat einen sehr effizienten URI-Parser . Die Verwendung ist wie folgt:

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

Sie können die Abfrageparameter wie folgt einstellen:

uri withQuery ("param2" -> "2", "param3" -> 3")
15
theon

Theons Bibliothek sieht ziemlich schön aus. Aber wenn Sie nur eine schnelle Codierungsmethode wünschen, habe ich diese. Es behandelt optionale Parameter und erkennt auch JsValues ​​von spray-json und kompaktiert sie vor der Kodierung. (Dies sind die beiden Dinge, über die ich mir Sorgen machen muss, aber Sie könnten den Match-Block leicht auf andere Fälle erweitern, für die Sie eine spezielle Behandlung wünschen.)

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("?", "&", "")
}
4
ryryguy

Der Versand wurde noch nicht erwähnt.

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

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

auch nützlich: https://github.com/mobiworx/urlifier

val url = (http || "some-domain".de) ? german & version(1) & foobar
url.toString
0
tfh