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
相关产品推荐
相关产品推荐

