如何创建自定义解组器以使用 akka-http 处理参数列表



我正在尝试从发送到我的路由的输入中取消封送参数,以便路由能够处理参数并在参数格式不正确时发回 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)使用自定义编组器,该编组在:处拆分字符串并将第二个值转换为IntCsvSeq使用此自定义编组器取消选取 orderBy 中的每个逗号分隔值。

最新更新