阿卡HTTP不处理与美元符号正确的参数?

问题描述:

我已经(OData的)查询参数在我的路线定义,像这样:阿卡HTTP不处理与美元符号正确的参数?

parameters(('$top.as[Int].?, '$skip.as[Int].?)) { (top, skip) => 

我有以下的拒绝处理程序来处理所有无效的参数(handleAll):

RejectionHandler.newBuilder() 
    .handleAll[MalformedQueryParamRejection] { paramRejections => 
    // paramRejections is a Seq[MalformedQueryParamRejection] 
    ... 
    } 

的问题是,当调用以下

some-endpoint?$top=invalid&$skip=invalid 

在拒绝处理的paramRejections有2项,为$顶部,而不是一个$顶部,一个为$跳过。 ,

似乎与美元符号存在params,因为当我删除这个事情按预期工作。这是一个已知的问题或是否有可用的解决方法(不包括移除美元符号)?

请注意,它似乎是它唯一的拒绝处理程序,它具有以美元符号开头的多个参数的问题,因为在$ top和$ skip提供有效的情况下,路径中的此行正确指定top并跳转到变量值的URI:

parameters(('$top.as[Int].?, '$skip.as[Int].?)) { (top, skip) => 
+0

请问这个问题百分号编码的帮助? '%24top ='而不是'$ top ='。美元符号被保留为子分隔符并且只有在编码百分比时才被正确解析。在我的复制中它工作得很好。 –

+0

不可以,客户应该被允许使用美元符号,根据OData标准:http://www.odata.org/documentation/odata-version-2-0/uri-conventions/ – Rory

+0

@chunjef这是不相干的,所有重要的是提供给handleAll的参数拒绝是不正确的,如我的问题 – Rory

没有您的路由树配置出现问题,可能有两个候选路线进行评估和每一个生产MalformedQueryParamRejection$top查询参数。

拒绝处理程序中的paramRejections有两个条目,既用于$ top,也用于$ top而另一个用于$ skip。

handleAll不收集多个MalformedQueryParamRejection源自相同的路线,但它会从不同途径搜集拒绝。

paramRejectionsSeq[MalformedQueryParamRejection],但一条路由可能会被拒绝,只有一个MalformedQueryParamRejection,具体来说(仅)第一个查询参数不符合所需的格式。

以最小route配置尝试(如下面的例子),你会体验到正确的行为:

val route = get { 
    parameters(('$top.as[Int].?, '$skip.as[Int].?)) { 
    (top, skip) => complete(s"$top, $skip") 
    } 
} 
+0

你是对的,有一个公开的问题来实现我所需要的行为; https://github.com/akka/akka-http/issues/1490 – Rory