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

