You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 11:20:34