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

Scala新手求教:如何将Curl请求最简转换为Scala代码?

最简Scala实现Curl POST请求方案

原代码问题分析

  • basicRequest属于sttp库,但未明确导入依赖及相关包
  • 方法内部定义case class在Scala 2中易引发序列化问题,建议移至方法外
  • 重复设置Content-Type(header与contentType冗余,sttp的contentType已足够)
  • 同步send()需引入对应后端实现,否则无法执行请求
  • 错误处理过于宽泛,未利用sttp原生的响应错误机制

最简实现方案(基于sttp库)

1. 添加依赖(build.sbt)

libraryDependencies += "com.softwaremill.sttp.client3" %% "core" % "3.9.15"

2. 极简代码实现(直接构造JSON字符串)

适合新手快速验证,无需额外JSON序列化依赖:

import com.softwaremill.sttp.client3._

object VaultTokenFetcher {
  def getTokenFromVault(signedJWT: String, vaultAddr: String, vaultAuthPath: String, vaultRole: String): String = {
    // 初始化JDK原生同步后端
    val backend = HttpURLConnectionBackend()
    
    // 构造与curl一致的JSON请求体
    val jsonBody = s"""{"jwt": "$signedJWT", "role": "$vaultRole"}"""
    
    // 执行请求并处理响应
    basicRequest
      .post(uri"$vaultAddr/v1/$vaultAuthPath")
      .contentType("application/json")
      .body(jsonBody)
      .send(backend)
      .fold(
        error => throw new RuntimeException(s"从Vault获取Token失败: ${error.getMessage}"),
        responseBody => responseBody
      )
  }
}

3. 结构化版本(用case class序列化)

适合生产环境,类型更安全:

import com.softwaremill.sttp.client3._
import com.softwaremill.sttp.client3.json4s._
import org.json4s.native.Serialization

// 定义结构化请求体,便于类型检查
case class TokenRequest(jwt: String, role: String)

object VaultTokenFetcher {
  // 隐式JSON序列化配置
  implicit val formats = org.json4s.DefaultFormats
  implicit val serialization: Serialization = org.json4s.native.Serialization

  def getTokenFromVault(signedJWT: String, vaultAddr: String, vaultAuthPath: String, vaultRole: String): String = {
    val backend = HttpURLConnectionBackend()
    val requestData = TokenRequest(signedJWT, vaultRole)
    
    basicRequest
      .post(uri"$vaultAddr/v1/$vaultAuthPath")
      .contentType("application/json")
      .body(requestData)
      .send(backend)
      .fold(
        error => throw new RuntimeException(s"从Vault获取Token失败: ${error.getMessage}"),
        _.body
      )
  }
}

代码说明

  • sttp库:Scala生态中轻量易用的HTTP客户端,语法结构与curl高度匹配,学习成本低
  • 同步后端:HttpURLConnectionBackend基于JDK原生实现,无需额外依赖,适合快速开发
  • 响应处理:用fold直接处理sttp返回的Either类型,明确区分成功/失败场景,避免无差别捕获异常

内容的提问来源于stack exchange,提问作者Lyes S

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 00:56:28