Scala/URL
Scalaにおいて、URLを扱うための標準で提供されているユーティリティはjava.net.URL
まあまあ貧弱
相対URLを扱えない
pathが構造化されておらず、文字列を生で扱う必要がある
そこで、http系のライブラリは独自の構造を作って扱いがち
そんな中でも、sttp-coreに含まれるsttp.model.Uriが扱いやすそうなので勉強したメモ
ライブラリ
"com.softwaremill.sttp.client3" %% "core" % "3.10.1"
sttpというHTTPクライアントライブラリのうち、コア部分だけを分離したモジュール
他の依存性が一切ないので扱いやすい
sttp.model.Uri
URIを扱うためのモデル
URIを作成する
code:scala
import sttp.model.Uri
import Uri.{*, given}
URIを作成するには、基本的にuri string interpolatorを使う
Uri.applyも使えるが、これは各要素を分割するような場合
あとは直感的に「これ書けるんじゃないか」ということは大抵書ける
相対URIを作ることができる
code:scala
val u: Uri = uri"foo/bar.html"
// => foo/bar.html
URIは変数をinterpolateして構成できる
code:scala
val path: OptionString = Some("bar") host, query, fragmentsにOptionを使うことができる。Noneの場合は勝手に省略してもらえる
ドキュメントにはないがpathにも使えるようだ
code:scala
queryにMap、ペアのタプルのシーケンス、値のシーケンスを使うことができる。
code:scala
値部分にOptionを使うこともできる。Noneの場合は消える
code:scala
val params: Map[String, OptionString] = Map("foo" -> Some("bar"), "hoge" -> None) host, pathにシーケンスを使うことができる。ここにもOptionを使うことができる
code:scala
val h = Seq("sub", "example", "com")
val p = Seq(Some("this"), Some("is"), None, Some("cool"))
URIの先頭にプロトコルを含む文字列を埋め込んだ場合、基底URIとみなされ、エスケープせずにそのまま埋めてもらえる
code:scala
val p: Uri = uri"$base/foo/bar"
URIを操作する
URIの各部品を取り出すことができる
u.