如何在查询参数中喷射解组列表

时间:2014-09-29 19:40:54

标签: scala routes spray spray-dsl

我是新来的喷雾剂。我正在玩构建路由,虽然我设法使用参数指令从查询字符串中获取参数,但是当我希望其中一个参数成为列表时,我遇到了麻烦。

对于这个例子,我已经定义了这个案例类:

case class Person(name: String, friends: Int)

我的路线目前看起来像这样:

path("test") { 
    get { parameters('name, 'friend ).as(Person) { p => complete(p) } }
}

这很好用,我可以做一个get:localhost:8080 / test?name = jo& friends = 12 并得到我期望的。

我想传递朋友ID的列表,而不仅仅是朋友的数量,所以我开始更改我的案例类:

case class Person(name: String, friends: Array[Int])

我打电话给:localhost:8080 / test?name = jo& friends = 1,2

这不编译。我得到一个类型不匹配:     发现:Person.type     required:spray.routing.HListDeserializer [shapeless。:: [String,shapeless。:: [String,shapeless.HNil]],?]     get {parameters('name,'friend).as(Person){p =>                                          ^评论:这指向P in .as(Person)

对我做错了什么的任何想法?我喜欢这个怎么做的答案。更好的是解释它正在寻找的这种无形类型。感谢

1 个答案:

答案 0 :(得分:4)

第一个示例有效,因为参数'friend可以自动从String转换为Int,因此可以满足Person案例类的要求。

后者不起作用,因为没有String => Array[Int]转换可用,因此无法从两个字符串中实现Person

您可以通过查看邮件错误来判断它是将'friend'name都视为字符串

spray.routing.HListDeserializer[shapeless.::[String,shapeless.::[String,shapeless.HNil]],?]

可以简化为

String :: String :: HNil

即。它正在寻找可以将两个字符串反序列化为其他内容的东西。

从底线开始,您需要提供自定义反序列化器,以便将"1,2"解析为Array[Int]

以下是相关文档:http://spray.io/documentation/1.1-SNAPSHOT/spray-httpx/unmarshalling/#unmarshalling