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

Posted

技术标签:

【中文标题】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.queryStringPlay 2.4.x 中是否有一个方便的助手可以从 play.api.mvc.Request.queryString 构建一个 uri 【发布时间】:2015-09-14 15:32:47 【问题描述】:

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

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——有人知道那可能在哪里吗?

尽管我一直在努力不写代码,但很遗憾我一直在寻找理由……

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

【问题讨论】:

你的最后一段 a) 让我微笑 b) 告诉我你是一个非常有经验的开发者 c) 提醒我为什么开源软件很棒。谢谢! @milkhouse 只是身经百战——也许 :) 【参考方案1】:

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

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。

【讨论】:

好吧,即使我不能重复使用它,至少我可以复制它:) 就像一个魅力! 我会为你向敌人提出的问题提交 PR 该死的电话。你在问什么。因为我也有同样的需要。会在这里告诉你们进展如何。 那太棒了,非常感谢!【参考方案2】:

我会为此推荐 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 包装器的看似庞大的功能之一。参考bug:https://github.com/playframework/playframework/issues/3247

【讨论】:

【参考方案3】:

试试 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

【讨论】:

以上是关于Play 2.4.x 中是不是有一个方便的助手可以从 play.api.mvc.Request.queryString 构建一个 uri的主要内容,如果未能解决你的问题,请参考以下文章

Play Framework 2.4.x - 覆盖默认的 Actor 系统创建

Play 2.4 添加模块而不是插件

Play Framework [2.4.x] - 模块路由特定名称因“资产不是包的成员”而失败

扩展 Play Framework 2.4.x 背后的方法

Play Framework [2.4.x] 如何在子模块的路由文件中处理公共资产

Play 2.4.x - 资产复制