scala - 如何在查询参数中喷射解码列表

标签 scala routes spray spray-dsl

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

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

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

我的路线目前是这样的:
path("test") { 
    get { parameters('name, 'friend ).as(Person) { p => complete(p) } }
}

这工作正常,我可以做一个获取:localhost:8080/test?name=jo&friends=12
并得到我的期望。

我想传递一个 friend ID 列表,而不仅仅是 friend 的数量,所以我开始改变我的案例类,如下所示:
case class Person(name: String, friends: Array[Int])

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

这不编译。我得到一个类型不匹配:
发现:Person.type
需要:spray.routing.HListDeserializer[shapeless.::[String,shapeless.::[String,shapeless.HNil]],?]
获取 { 参数('姓名,' friend )。作为(人){ p =>
^ 评论:这指向 .as(Person) 中的 P

知道我做错了什么吗?我很想知道如何做到这一点。更好的是解释它正在寻找的这种无形的类型是什么。谢谢

最佳答案

第一个例子从参数 '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

关于scala - 如何在查询参数中喷射解码列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26107581/

相关文章:

scala - Scala 中奇怪的类型不匹配

php - PHP 路由之谜

javascript - 从 python 中调用 Javascript 函数,在 html 中调用 Flask 函数

javascript - URL 哈希显示为 url.com/something#/而不是 url.com/something/#/

scala - 从 SBT 执行 Gatling 负载测试

scala - 组合喷射路由 + Actor 模式匹配

java - 如何从Elasticsearch读取数据到Spark?

scala - 将类型安全配置解析为案例类

scala - 使用 Spray 解析 HTML

scala - 如何并行化groupBy