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 Framework [2.4.x] - 模块路由特定名称因“资产不是包的成员”而失败