我发送http发布请求时发现错误:
请求内容格式不正确:没有可用的性别值 找不到可以转换为java.lang.String
的值
我的请求正文:
{
"name":"test"
}
使用我的Scala代码进行路由:
path("test"){
(post(entity(as[People]) { req =>
val resp = queryData(req)
complete(resp.meta.getOrElse("statusCode", 200).asInstanceOf[Int] -> resp)
}))
} ~
People
的代码:
case class People(name: String, gender: String = "male")
为什么仍然出现malformed
错误???
答案 0 :(得分:2)
即使您输入默认值,Json的提取也将查找该字段,并且该字段不存在,因此将失败。 (我假设您使用的是Spray-json,因为它是akka-http中的默认设置)
为了避免这个问题,在保持简单的同时,我建议您为创建人员的请求创建一个案例类,其中包含该字段的Option [String],然后可以将PeopleCreateRequest转换为一个人很容易。
case class PeopleCreateRequest(name: String, gender: Option[String])
这将很好地与框架配合使用...
或者,如果您希望保持这种设计,则需要考虑实现自己的JsonFormat [People],它将将此值视为可选值,但在缺少时添加默认值。
查看spray-json https://github.com/spray/spray-json#providing-jsonformats-for-other-types
但是我想这会是这样的:
implicit val peopleFormat = new RootJsonFormat[People] {
def read(json: JsValue): People = json match {
case JsArray(Seq(JsString(name), JsString(gender))) =>
People(name, gender)
case JsArray(Seq(JsString(name))) =>
People(name)
case _ => deserializationError("Missing fields")
}
def write(obj: People): JsValue = ???
}
我通常使用不同的JsonSupport和circe,但希望这会为您提供解决问题的方向