如何使用akka-http创建自定义unmarshallers来处理参数列表?

问题描述 投票:0回答:2

我正在尝试从发送到我的路由的输入中解组参数,以便路由能够处理参数并在参数未正确格式化时发回BadRequest。我正在研究解析的具体参数是REST-ful应用程序中使用的orderBy请求。

我想通过让多个字段与排序整数结合来构造请求。字段和整数由:分隔,而字段 - 整数组合以逗号分隔。

此请求的示例如下所示:/path?orderBy=id:-1,name:1

我想创建一个自定义unmarshaller,它能够将此参数列表转换为List[(String, Int)],以发送到我的查询函数,该函数将对其进行分解并在查询中使用它。 Akka-http支持CsvList unmarshaller但是这不适合我的实现。

scala unmarshalling akka-http
2个回答
1
投票

根据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 =>
    ...
  }

0
投票

这应该工作:

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中每个逗号分隔值。

© www.soinside.com 2019 - 2024. All rights reserved.