【问题标题】:How do I create custom unmarshallers to process parameter lists using akka-http?如何使用 akka-http 创建自定义解组器来处理参数列表?
【发布时间】:2019-04-05 11:13:39
【问题描述】:

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

我正在考虑通过将多个字段与排序整数相结合来构建请求。字段和整数用: 分隔,而字段-整数组合用逗号分隔。

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

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

【问题讨论】:

    标签: scala unmarshalling akka-http


    【解决方案1】:

    根据蒂姆提供的答案,我能够想出一个稍微不同的答案。 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 =>
        ...
      }
    

    【讨论】:

      【解决方案2】:

      这应该可行:

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

      【讨论】:

      • 当尝试使用多个可选参数时,我收到以下错误:Error:(37, 37) 3 more arguments than can be applied to method parameters: (pdm: akka.http.scaladsl.server.directives.ParameterDirectives.ParamMagnet)pdm.Out 'limit.as[Int].?, 使用以下代码:parameters('orderBy.as(CsvSeq[(String, Int)]).?, 'limit.as[Int].?, 'offset.as[Int].?, 'fields.as(csvList[String]).?)
      • 很难判断这是否与自定义编组器有关。尝试创建最简单的版本,它可以在没有自定义编组器的情况下工作,但在使用自定义编组器时会失败。
      猜你喜欢
      • 1970-01-01
      • 2015-06-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-12
      • 1970-01-01
      • 2014-06-07
      • 1970-01-01
      相关资源
      最近更新 更多