Parsing Scala-带有查询字符串解析器和生成器DSL的URL

Parsing Scala-带有查询字符串解析器和生成器DSL的URL,parsing,scala,url,query-string,dsl,Parsing,Scala,Url,Query String,Dsl,在Scala中,如何以编程方式使用查询字符串参数构建URL 另外,如何将包含带有查询字符串参数的URL的字符串解析为允许我以编程方式编辑查询字符串参数的结构?以下库可以帮助您解析和构建带有查询字符串参数的URL(免责声明:这是我自己的库): 它提供了一个DSL,用于构建带有查询字符串的URL: val uri = "http://example.com" ? ("one" -> 1) & ("two" -> 2) 您可以解析uri并将参数放入Map[String,List[

在Scala中,如何以编程方式使用查询字符串参数构建URL


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

以下库可以帮助您解析和构建带有查询字符串参数的URL(免责声明:这是我自己的库):

它提供了一个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

席恩的图书馆看起来很不错。但是如果你只是想要一个快速的编码方法,我有这个。它处理可选参数,还将从中识别JS值,并在编码之前压缩打印这些值。(这正好是我必须担心的两件事,但是你可以很容易地将匹配块扩展到你想特别处理的其他情况)

导入java.net.urlcoder
def buildEncodedQueryString(参数:Map[String,Any]):String={
val编码=用于{
(名称、值)URLEncoder.encode(x.compactPrint,“UTF8”)
案例x:JsValue=>urlcoder.encode(x.compactPrint,“UTF8”)
case Some(x)=>URLEncoder.encode(x.toString,“UTF8”)
case x=>URLEncoder.encode(x.toString,“UTF8”)
}
}收益名称+“=”+encodedValue
编码的.mkString(“?”,“&”,”)
}
喷雾剂有着非常好的效果。用法如下:

import spray.http.Uri
val uri = Uri("http://example.com/test?param=param")
uri withQuery ("param2" -> "2", "param3" -> 3")
您可以这样设置查询参数:

import spray.http.Uri
val uri = Uri("http://example.com/test?param=param")
uri withQuery ("param2" -> "2", "param3" -> 3")

调度还没有提到

val myRequest=host(“somehost.com”)/“some”/“path”也很有用:


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")

正如您所看到的,它会自动对所需的部分进行编码。

尝试KFoundation的URL类。它既是一个生成器又是一个解析器

例如

API文件:
依赖性:

是否有办法在喷雾之外使用此功能?从源头上看,它似乎与喷雾剂的其他部分非常耦合。你只需要非常小的模块。它只包含HTTP请求和响应的模型。它不包含任何服务器或客户端代码。@theon我们如何使用此喷洒路由?这是我的代码val请求:HttpRequest=Get(api)val管道:Future[SendReceive]={for{Http.HostConnectorInfo(connector,41; client.apply(request)},15秒)Http依赖于Akka:-(…仅仅为了解析URI而提取这种依赖项看起来太过工程化了。@RichardGomes。考虑到
spray http
仅仅是http数据结构的模型,我很惊讶。为什么呢?嗨@Ashalynd!URL似乎被破坏了
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")
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