18

在 Scala 中,如何以编程方式构建带有查询字符串参数的 URL?

另外,如何将String包含带有查询字符串参数的 URL 解析为允许我以编程方式编辑查询字符串参数的结构?

4

7 回答 7

15

Spray 有一个非常高效的 URI 解析器。用法是这样的:

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

您可以像这样设置查询参数:

uri withQuery ("param2" -> "2", "param3" -> 3")
于 2013-10-26T20:21:36.423 回答
13

以下库可以帮助您解析和构建带有查询字符串参数的 URL(免责声明:这是我自己的库):https ://github.com/lemonlabsuk/scala-uri

它提供了一个 DSL 来构建带有查询字符串的 URL:

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
于 2012-11-19T22:23:50.010 回答
4

Theon的图书馆看起来很不错。但如果你只想要一种快速编码方法,我有这个。它处理可选参数,并且还会从spray-json识别 JsValues并在编码之前压缩打印它们。(这些恰好是我必须担心的两件事,但是您可以轻松地扩展匹配块以用于您想要对其进行特殊处理的其他情况)

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("?", "&", "")
}
于 2013-05-02T23:29:16.923 回答
2

sttp 为此提供了一个很好的 URI 插值器。

请参阅此处的文档

这里是它的例子:

import sttp.client._
import sttp.model._

val user = "Mary Smith"
val filter = "programming languages"

val endpoint: Uri = uri"http://example.com/$user/skills?filter=$filter"

assert(endpoint.toString ==
  "http://example.com/Mary%20Smith/skills?filter=programming+languages")

如您所见,它会自动对所需部分进行编码。

于 2020-07-19T10:54:59.583 回答
0

还没有提到派送。

https://dispatchhttp.org/Defining+requests.html

val myRequest = host("somehost.com") / "some" / "path" <<? Map("id" -> "12345")
于 2014-02-25T08:40:08.540 回答
0

也很有用:https ://github.com/mobiworx/urlifier

val url = (http || "some-domain".de) ? german & version(1) & foobar
url.toString
于 2014-08-27T06:32:22.880 回答
0

试试 KFoundation 的 URL 类。它既是构建器又是解析器。

例如

val url1 = URL("http://exampel.net/path")
val url2 = url1/"subpath"        // -> http://exampel.net/path/subpath
val url3 = url2?("key"->"value") // -> http://exampel.net/path/subpath?key=value

API 文档:https ://mscp.co/resouces/apidoc/kfoundation/scala/0.3/net/kfoundation/scala/io/URL.html 依赖:https ://search.maven.org/artifact/net.kfoundation/ kfoundation-scala_2.13/0.3.1/jar

于 2021-03-15T14:01:19.773 回答