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,但根据代码,它只不过是脑死亡值。
某个地方可能会从这样的 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
我原以为 Request
上的 copy
更新后的 queryString
会重置 URI,但根据代码,它只不过是脑死亡值。
某个地方可能会从这样的 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:
,还有 urlbuilderhttps://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