Scala STTP错误处理:如何将返回错误转为其他样例类?
Scala STTP 错误响应转样例类实现方案
方案一:统一在请求定义中指定错误解析逻辑
STTP支持直接通过asEither将成功和错误响应分别解析为不同的样例类,无需后续手动判断转换。假设你的错误样例类为MyErrorClass,修改请求定义如下:
// 确保已引入对应JSON库的STTP集成(如Circe:import sttp.client3.circe._) val request = basicRequest .get(uri"$fullUri") .headers(headers) // 第一个参数解析2xx成功响应,第二个参数解析非2xx错误响应 .response(asEither(asJson[MyClass], asJson[MyErrorClass]))
发送请求后,结果会直接返回Either[ResponseException[MyErrorClass, String], MyClass]:
- 2xx状态码且解析成功 →
Right(MyClass实例) - 非2xx状态码且解析成功 →
Left(ResponseException(MyErrorClass实例, ...)) - 解析失败 →
Left(ResponseException(解析错误信息, ...))
这种方式更符合STTP的设计思路,代码更简洁易维护。
方案二:在结果处理阶段手动解析错误
如果需要保留原有请求定义,在Success(result)分支中手动解析错误响应体,可以直接调用STTP的asJson解析器:
case Success(result) => if (result.code != StatusCode.Ok) { // 手动将非OK响应体解析为MyErrorClass asJson[MyErrorClass].apply(result.body, result.headers, result.code) match { case Right(error) => Left(error) case Left(parseErr) => Left(s"错误解析失败: ${parseErr.getMessage}") } } else { result.body match { case Left(parseErr) => // 若成功状态下解析失败,也可尝试解析为错误类(按需选择) asJson[MyErrorClass].apply(parseErr.getMessage, result.headers, result.code) match { case Right(error) => Left(error) case Left(e) => Left(e) } case Right(data) => Right(data) } }
注意事项
- 确保你的
MyClass和MyErrorClass已配置好对应的JSON编解码器(如使用Circe时需添加io.circe.generic.semiauto._生成编码器/解码器)。 - 不同JSON库的STTP集成方式略有差异,需引入对应依赖(如Circe对应
sttp-client3-circe)。
内容的提问来源于stack exchange,提问作者vukojevicf
相关产品推荐
相关产品推荐

