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 結尾的鍵值配對,用來指定有關要求的額外詳細資料。網路伺服器可以使用這些參數來計算適當的回應。

例如,考慮以下 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

此頁面的貢獻者