web-dev-qa-db-ja.com

Scala-クエリ文字列パーサーとビルダーDSLを含むURL

In Scalaプログラムでクエリ文字列パラメータを使用してURLを作成するにはどうすればよいですか?

また、クエリ文字列パラメーターを含むURLを含むStringを、プログラムでクエリ文字列パラメーターを編集できる構造に解析するにはどうすればよいですか?

18
theon

次のライブラリは、クエリ文字列パラメーターを使用してURLを解析および構築するのに役立ちます(免責事項:これは私自身のライブラリです): https://github.com/lemonlabsuk/scala-uri

クエリ文字列を使用してURLを構築するためのDSLを提供します。

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

次のように、URIを解析し、パラメーターをMap[String,List[String]]に取得できます。

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

スプレーには非常に 効率的なURIパーサー があります。使用法は次のようになります。

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

クエリパラメータは次のように設定できます。

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

テオンの図書館はかなり素敵に見えます。しかし、急ごしらえのエンコード方法が必要な場合は、これを使用します。オプションのパラメーターを処理し、 spray-json からJsValueを認識し、エンコードする前にそれらをコンパクトに出力します。 (これらは私が心配しなければならない2つのことですが、特別な処理をしたい他の場合のためにマッチブロックを簡単に拡張することができます)

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

派遣についてはまだ触れられていません。

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

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

また便利です: https://github.com/mobiworx/urlifier

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