web-dev-qa-db-fra.com

Scala - URL avec analyseur de chaînes de requête et générateur DSL

Dans Scala, comment construire une URL avec des paramètres de chaîne de requête par programme?

Aussi, comment puis-je analyser une String contenant une URL avec des paramètres de chaîne de requête dans une structure qui me permet d’éditer les paramètres de chaîne de requête par programme?

18
theon

La bibliothèque suivante peut vous aider à analyser et à construire des URL avec des paramètres de chaîne de requête (Avertissement: ceci est ma propre bibliothèque): https://github.com/lemonlabsuk/scala-uri

Il fournit un DSL pour la construction d'URL avec des chaînes de requête:

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

Vous pouvez analyser un URI et obtenir les paramètres dans un Map[String,List[String]] comme ceci:

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

Spray a un analyseur URI très efficace . L'utilisation est comme si:

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

Vous pouvez définir les paramètres de requête comme suit:

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

La bibliothèque de Theon a l'air jolie, Nice. Mais si vous voulez juste une méthode d'encodage rapide, j'ai celle-ci. Il traite des paramètres facultatifs et reconnaîtra également les valeurs Js de spray-json et les imprimera de manière compacte avant l'encodage. (Ce sont les deux choses qui me préoccupent, mais vous pouvez facilement étendre le bloc de match pour les autres cas auxquels vous souhaitez donner un traitement spécial)

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

L'expédition n'a pas encore été mentionnée.

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

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

également utile: https://github.com/mobiworx/urlifier

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