字段'age2'只能从'application / x-www-form-urlencoded'表单内容中读取

时间:2013-05-14 01:32:32

标签: scala scala-2.10 spray

你们能告诉我为什么提取形式对multipart/form-datax-www-form-urlencoded请求起作用

formFields("firstName"?, "age2"?, "sex", "vip"?) {
  (firstName : Option[String], age2, sex, vip) =>
    complete(firstName + "." + age2 + "." + sex + "." + vip)
}

但这个看似相同的代码版本

formFields('firstName :: ("age2".as[Int]) :: ('sex?) :: ("VIP" ? false) :: HNil) {
  (firstName : String, age2 : Int, sex : Option[String], vip : Boolean) =>
    complete(firstName + "." + age2 + "." + sex + "." + vip)
}
当请求multipart/form-data编码时,

不起作用。

服务器返回以下错误:

There was a problem with the requests Content-Type:
Field 'age2' can only be read from 'application/x-www-form-urlencoded' form content

我看到spray.httpx.unmarshalling.FormField.fail的调用堆栈,但我的Scala技能不足以破译它。

2 个答案:

答案 0 :(得分:1)

“为int实现默认的unmarshaler”可以这样做:

object JsonImplicits extends DefaultJsonProtocol {
    implicit val IntUnmarshaller = Unmarshaller.delegate[String, Int](MediaRanges.`*/*`) { _.toInt }
}

在路线定义之前确定其范围,方法是在import JsonImplicits._

之前添加导入

答案 1 :(得分:0)

原来没有Int的默认解组。所以,如果你实施一个,那一切都有效。

不确定为什么维护者最初没有这样做。