STTP的基本使用(2):Json

1)对 Json 的支持

对 request,response 消息体中 JSON 的支持一般就是要做两件事:一是定义 josn 的格式规范,另外就是根据格式规范进行序列化、反序列化。STTP 提供开箱即用的对第三方 JOSN 库的支持:包括 Circe、Json4s、spray-json 等。
目前,从项目活跃度、维护程度上讲 Circe 应该是不错的选择。(https://scala.libhunt.com/compare-circe-vs-spray-json)

2)Circe

Circe 竟然是基于挑战智商的 CAT 实现的!官网: https://circe.github.io/circe/。
Circe 使用 Encoder、Decoder 编解码 josn。Encoder[A]把 A 转为 Json,Decoder[A]则把 Josn 转为 A 或者 Exception(如果失败话)。Circe 对 Scala 库中常见类型就提供了默认的隐式实例。
对于简单结构的 case class,使用 Circe 提供的自动、半自动的编解码就好。Circe 当然也支持自定义转换或对 ADT 类型数据转换。智商够用可以去看https://github.com/milessabin/shapeless。
使用 circe-optics 模块还可以对 Json 数据进行遍历、修改。
比如,下面从 order 中获取用户的电话号码。

1
val phoneNum = root.order.customer.contactDetails.phone.string

如下是调用 NASA 某 Api 并解析代码示例, 是不是太方便了?!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import io.circe.generic.auto._
import sttp.client._
import sttp.client.circe._

case class Links(self: String, next: String)
case class Page(number: Int, size: Int, total_elements: Int, total_pages: Int)
case class NearEarthObject(absolute_magnitude_h: Double, designation: String)
case class NasaData(links: Links, page: Page, near_earth_objects: List[NearEarthObject])

implicit val backend = HttpURLConnectionBackend()
val resp = basicRequest
.get(uri"https://api.nasa.gov/neo/rest/v1/neo/browse?api_key=${NASA_API_KEY}")
.response(asJson[NasaData])
.send()

resp.body match {
case Left(failure) => println(failure)
case Right(data) => {
println("Get response from NAS Api:")
println(data)
}
}

3)Resilience 弹性

STTP本身不提供Resilience方面的支持,可以借助上层的第三方库(Future、Monix、Akka、Resilientce4J)实现诸如:重试、断路、限流这样的功能。