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

Scalatra应用中json4s处理浏览器表单POST请求报JsonMappingException原因

异常触发原因
  • 浏览器提交原生POST表单时的默认行为触发了Scalatra的自动表单解析逻辑:浏览器提交普通表单时默认会将请求头Content-Type设为application/x-www-form-urlencoded,请求体为key1=value1&key2=value2格式的键值对字符串。Scalatra收到符合该格式规则的请求后,会自动将请求体内容解析到params全局集合中,解析完成后会清空原始request.body的内容。你在代码中直接读取request.body拿到的是空字符串,json4s解析空内容就会抛出No content to map due to end-of-input异常。
  • CLI/REST客户端提交无报错的原因:你在使用CLI/REST客户端发起请求时,虽然手动指定了Content-Type为application/x-www-form-urlencoded(注意正确拼写应为application/x-www-form-urlencoded),但实际请求体传入的是符合JSON格式的字符串,不符合表单键值对的格式规则,Scalatra自动解析表单失败,就不会清空request.body的内容,因此可以正常读取到完整的JSON字符串完成解析。
  • 补充:你当前的代码逻辑是按接收JSON请求编写的,本身就不匹配浏览器原生表单提交的场景,就算request.body没有被清空,直接拿表单格式的字符串做JSON解析依然会抛出格式错误。
修复方案
  • 如果你要兼容浏览器原生表单提交:移除JSON解析逻辑,直接从params集合中读取对应字段构造MRecord对象即可,不需要用到json4s相关能力。
  • 如果你要统一用JSON格式接收请求:需要调整前端提交逻辑,浏览器原生表单不支持直接提交JSON格式,需要通过JS异步提交(如fetch/axios),指定请求头Content-Type: application/json,同时传入序列化后的JSON字符串作为请求体。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 23:45:03