阿卡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) =>
没有您的路由树配置出现问题,可能有两个候选路线进行评估和每一个生产MalformedQueryParamRejection
为$top
查询参数。
拒绝处理程序中的paramRejections有两个条目,既用于$ top,也用于$ top而另一个用于$ skip。
handleAll
不收集多个MalformedQueryParamRejection
源自相同的路线,但它会从不同途径搜集拒绝。
paramRejections
是Seq[MalformedQueryParamRejection]
,但一条路由可能会被拒绝,只有一个MalformedQueryParamRejection
,具体来说(仅)第一个查询参数不符合所需的格式。
以最小route
配置尝试(如下面的例子),你会体验到正确的行为:
val route = get {
parameters(('$top.as[Int].?, '$skip.as[Int].?)) {
(top, skip) => complete(s"$top, $skip")
}
}
你是对的,有一个公开的问题来实现我所需要的行为; https://github.com/akka/akka-http/issues/1490 – Rory
请问这个问题百分号编码的帮助? '%24top ='而不是'$ top ='。美元符号被保留为子分隔符并且只有在编码百分比时才被正确解析。在我的复制中它工作得很好。 –
不可以,客户应该被允许使用美元符号,根据OData标准:http://www.odata.org/documentation/odata-version-2-0/uri-conventions/ – Rory
@chunjef这是不相干的,所有重要的是提供给handleAll的参数拒绝是不正确的,如我的问题 – Rory