Play 2.4.x 中是否有一个方便的助手来从 play.api.mvc.Request.queryString 构建一个 uri

Is there a convenient helper in Play 2.4.x to build a uri from play.api.mvc.Request.queryString

我原以为 Request 上的 copy 更新后的 queryString 会重置 URI,但根据代码,它只不过是脑死亡值。

https://github.com/playframework/playframework/blob/2.4.x/framework/src/play/src/main/scala/play/api/mvc/Http.scala

某个地方可能会从这样的 Map[String -> Seq[String]] 构建 URI -- 有人知道它可能在哪里吗?

虽然我一直在努力不写代码,但我一直运行 有理由...

除了总是那些愚蠢的极端情况、语言、特殊字符、编码和许多其他潜在的未知数之外,很可能是微不足道的,如果有人已经自豪地带着这些伤疤,我宁愿通过使用它来纪念他们的工作.

我绝对会做同样的事情。 :)

play.api.libs.ws.WSRequest#uri 有代码:

  /**
   * The URI for this request
   */
  lazy val uri: URI = {
    val enc = (p: String) => java.net.URLEncoder.encode(p, "utf-8")
    new java.net.URI(if (queryString.isEmpty) url else {
      val qs = (for {
        (n, vs) <- queryString
        v <- vs
      } yield s"${enc(n)}=${enc(v)}").mkString("&")
      s"$url?$qs"
    })
  }

在 GitHub 上是 here

我会为此推荐 scala-uri:

https://github.com/NET-A-PORTER/scala-uri#query-strings\

我特别询问了 scala-uri 是否符合 RFC 3986(处理 URI 编码边缘情况),他们知道这些问题并认为他们的工作是确保它们不会发生:

https://github.com/NET-A-PORTER/scala-uri/issues/81

如果您使用 Java:

,还有 urlbuilder

https://github.com/palominolabs/url-builder

至于为什么它不在 Play 本身中 -- 已经讨论过了。 URI 处理是一件痛苦的事情,但不幸的是,它是那些难以提供 Play 包装器的看似很大的功能之一。参见参考错误:https://github.com/playframework/playframework/issues/3247

试试 KFoundation 的 URL class。它既是构建器又是解析器。它也 decoding/encoding。

例如

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