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

Scala中HttpsRequest设置JSON请求Content-Type遇响应异常

问题分析与修复方案

问题场景

使用Scala程序向远程服务器发送HTTP POST请求,返回状态码200 OK,但响应结果和以下可正常运行的curl命令不一致:

curl -X POST -H "Content-Type: application/json"  -d @payload.json -u "user:password" url

核心问题

Scala代码存在两处关键错误:

  • 虽指定了ContentTypes.application/json``,但请求体采用了表单格式拼接(source=$body&language=Scala&theme==Sunburst),和curl直接发送JSON请求体的逻辑完全不符,导致服务器无法正确解析
  • 定义的JSON字符串存在语法错误:"ID:\"test\""应为"\"ID\":\"test\"",引号转义不正确

修正后的代码

// 修正JSON语法错误,确保格式正确
val body = "[{\"Field1\":\"XYZ\",\"Field2\":1,\"ID\":\"test\"}]"

val authorization = Some(headers.Authorization(BasicHttpCredentials(username, password)))
val request = HttpRequest(
  method = HttpMethods.POST,
  uri = url,
  headers = authorization.toList,
  // 直接将JSON字符串作为请求体,和curl的-d @payload.json逻辑一致
  entity = HttpEntity(ContentTypes.`application/json`, body)
)

val responseFuture: Future[HttpResponse] = Http().singleRequest(request)
responseFuture.onComplete {
  case Success(res) => println(res.toString())
  case Failure(e) => sys.error(s"请求失败: ${e.getMessage}")
}

如果原本curl中的payload.json包含更多参数(比如source、language、theme),需要将这些参数整合到JSON结构中,而不是用表单拼接。例如若payload.json内容是:

{
  "source": "[{\"Field1\":\"XYZ\",\"Field2\":1,\"ID\":\"test\"}]",
  "language": "Scala",
  "theme": "Sunburst"
}

则Scala代码中的body应修改为对应的JSON字符串:

val body = """{"source": "[{\"Field1\":\"XYZ\",\"Field2\":1,\"ID\":\"test\"}]", "language": "Scala", "theme": "Sunburst"}"""

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 00:32:45