我正在尝试从发送到我的路由的输入中取消封送参数,以便路由能够处理参数并在参数格式不正确时发回 BadRequest。我正在查看解析的特定参数是 REST-ful 应用程序中使用的 orderBy 请求。
我正在考虑通过多个字段和一个排序整数来构建请求。字段和整数用:
分隔,而字段-整数组合用逗号分隔。
此请求的示例如下所示:/path?orderBy=id:-1,name:1
我想创建一个自定义解组器,该解组器能够将此参数列表转换为要发送到我的查询函数的List[(String, Int)]
,该函数将分解它并在查询中使用它。Akka-http支持CsvList
解组器,但这不足以实现。
根据蒂姆提供的答案,我能够想出一个稍微不同的答案。Tim 的原始答案在定义中有一个不必要的隐式参数,可以将其删除,因为此实现不需要自己的解组器。它是一个基础解组器。
我这样做了:
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
中的每个逗号分隔值。