我正在尝试从发送到我的路由的输入中解组参数,以便路由能够处理参数并在参数未正确格式化时发回BadRequest。我正在研究解析的具体参数是REST-ful应用程序中使用的orderBy请求。
我想通过让多个字段与排序整数结合来构造请求。字段和整数由:
分隔,而字段 - 整数组合以逗号分隔。
此请求的示例如下所示:/path?orderBy=id:-1,name:1
我想创建一个自定义unmarshaller,它能够将此参数列表转换为List[(String, Int)]
,以发送到我的查询函数,该函数将对其进行分解并在查询中使用它。 Akka-http支持CsvList
unmarshaller但是这不适合我的实现。
根据Tim提供的答案,我能够得出一个略有不同的答案。 Tim的原始答案在定义中有一个不必要的隐式参数,可以删除,因为这个实现不需要自己的unmarshaller。它是一个基础unmarshaller。
我这样做了:
implicit val pairSeq = Unmarshaller.strict[String, (String, Int)] { string =>
val Array(a, b) = string.split(':')
a -> b.toInt
}
...
import foo.pairSeq
path("PATH") {
parameter("orderBy".as(CsvSeq[(String, Int)])) { ob =>
...
}
这应该工作:
implicit def pairSeq(implicit unmarshaller: Unmarshaller[String, (String, Int)]) =
Unmarshaller.strict[String, (String, Int)] { string =>
val Array(a, b) = string.split(':')
a -> b.toInt
}
...
path("PATH") {
parameter("orderBy".as(CsvSeq[(String, Int)])) { ob =>
...
}
如果参数格式正确,ob
将是List[(String, Int)]
。
这使用(String, Int)
的自定义编组器,它将字符串分割为:
并将第二个值转换为Int
。 CsvSeq
使用此自定义编组器来取消orderBy
中每个逗号分隔值。