Scala Toolkit

如何构建 URI 和查询参数?

语言

你可以在一行中要求整个工具包

//> using toolkit latest

或者,你只需要求 sttp 的特定版本

//> using dep com.softwaremill.sttp.client4::core:4.0.0-M1

在你的 build.sbt 文件中,你可以添加对 Toolkit 的依赖项

lazy val example = project.in(file("example"))
  .settings(
    scalaVersion := "3.2.2",
    libraryDependencies += "org.scala-lang" %% "toolkit" % "0.1.7"
  )

或者,你只需要求 sttp 的特定版本

libraryDependencies += "com.softwaremill.sttp.client4" %% "core" % "4.0.0-M1"

在你的 build.sc 文件中,你可以添加对 Toolkit 的依赖项

object example extends ScalaModule {
  def scalaVersion = "3.2.2"
  def ivyDeps =
    Agg(
      ivy"org.scala-lang::toolkit:0.1.7"
    )
}

或者,你只需要求 sttp 的特定版本

ivy"com.softwaremill.sttp.client4::core:4.0.0-M1"

uri 插值器

uri 是一个自定义 字符串插值器,它允许你创建有效的网络地址,也称为 URI。例如,你可以编写 uri"https://example.com/"

您可以使用常见的 $${} 语法在 URI 中插入任何变量或表达式。例如 uri"https://example.com/$name",将变量 name 的值插入到 URI 中。如果 name 包含 "peter",结果为 https://example.com/peter

uri 会自动转义特殊字符,如下例所示

import sttp.client4.quick._
import sttp.model.Uri

val book = "programming in scala"
val bookUri: Uri = uri"https://example.com/books/$book"

println(bookUri)
// prints: https://example.com/books/programming%20in%20scala
import sttp.client4.quick.*
import sttp.model.Uri

val book = "programming in scala"
val bookUri: Uri = uri"https://example.com/books/$book"

println(bookUri)
// prints: https://example.com/books/programming%20in%20scala

查询参数

查询参数是附加到 HTTP 请求 URI 末尾的一对键值,用于指定有关请求的其他详细信息。Web 服务器可以使用这些参数来计算适当的响应。

例如,考虑以下 URL

https://example.com/search?q=scala&limit=10&page=1

它包含三个查询参数:q=scalalimit=10page=1

使用查询参数映射

uri 插值器可以将 Map[String, String] 插值成查询参数

val queryParams = Map(
  "q" -> "scala",
  "limit" -> "10",
  "page" -> "1"
)
val uriWithQueryParams = uri"https://example.com/search?$queryParams"
println(uriWithQueryParams)
// prints: https://example.com/search?q=scala&limit=10&page=1

为了安全起见,插值器会自动转义参数中的特殊字符。

使用可选查询参数

查询参数可能是可选的。uri 插值器可以插值 Option

def getUri(limit: Option[Int]): Uri =
  uri"https://example.com/all?limit=$limit"

println(getUri(Some(10)))
// prints: https://example.com/all?limit=100

println(getUri(None))
// prints: https://example.com/all

请注意,当 limitNone 时,查询参数会完全消失。

使用序列作为单个查询参数的值

查询参数可以在 URI 中重复,以表示值列表。例如,?version=1.0.0&version=1.0.1&version=1.1.0 中的 version 参数包含 3 个值:1.0.01.0.11.1.0

要在 URI 中构建此类查询参数,可以在 uri"..." 中内插一个 Seq(或 ListArray 等)。

def getUri(versions: Seq[String]): Uri =
  uri"https://example.com/scala?version=$versions"

println(getUri(Seq("3.2.2")))
// prints: https://example.com/scala?version=3.2.2

println(getUri(Seq("2.13.8", "2.13.9", "2.13.10")))
// prints: https://example.com/scala?version=2.13.8&version=2.13.9&version=2.13.10

println(getUri(Seq.empty))
// prints: https://example.com/scala

此页面的贡献者