akka http 没有正确处理带有美元符号的参数?
akka http not handling parameters with dollar signs properly?
我在我的路线中定义了 (OData) 查询参数,如下所示:
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 个条目,both 用于 $top,而不是一个用于 $top,一个用于 $skip。
似乎与参数上的美元符号有关,因为当我删除它时,它会按预期工作。这是一个已知问题还是有可用的解决方法(不包括删除美元符号)?
注意,似乎只有拒绝处理程序对以美元符号开头的多个参数有问题,因为路由中的这一行在提供 $top 和 $skip 时正确分配了 top 和 skip 到变量URI 中的有效值:
parameters(('$top.as[Int].?, '$skip.as[Int].?)) { (top, skip) =>
您的路由树配置存在问题,可能评估了两个候选路由,每个候选路由都为 $top
查询参数生成一个 MalformedQueryParamRejection
。
The paramRejections in the rejection handler has 2 entries, both for $top, instead of one for $top and one for $skip.
handleAll
不收集来自同一路由的多个 MalformedQueryParamRejection
,但它收集来自不同路由的拒绝。
paramRejections
是一个 Seq[MalformedQueryParamRejection]
但一个路由可能会被拒绝,只有一个 MalformedQueryParamRejection
,特别是(仅)第一个查询参数不匹配所需的格式。
尝试使用最小 route
配置(如下例所示),您将体验到正确的行为:
val route = get {
parameters(('$top.as[Int].?, '$skip.as[Int].?)) {
(top, skip) => complete(s"$top, $skip")
}
}
我在我的路线中定义了 (OData) 查询参数,如下所示:
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 个条目,both 用于 $top,而不是一个用于 $top,一个用于 $skip。
似乎与参数上的美元符号有关,因为当我删除它时,它会按预期工作。这是一个已知问题还是有可用的解决方法(不包括删除美元符号)?
注意,似乎只有拒绝处理程序对以美元符号开头的多个参数有问题,因为路由中的这一行在提供 $top 和 $skip 时正确分配了 top 和 skip 到变量URI 中的有效值:
parameters(('$top.as[Int].?, '$skip.as[Int].?)) { (top, skip) =>
您的路由树配置存在问题,可能评估了两个候选路由,每个候选路由都为 $top
查询参数生成一个 MalformedQueryParamRejection
。
The paramRejections in the rejection handler has 2 entries, both for $top, instead of one for $top and one for $skip.
handleAll
不收集来自同一路由的多个 MalformedQueryParamRejection
,但它收集来自不同路由的拒绝。
paramRejections
是一个 Seq[MalformedQueryParamRejection]
但一个路由可能会被拒绝,只有一个 MalformedQueryParamRejection
,特别是(仅)第一个查询参数不匹配所需的格式。
尝试使用最小 route
配置(如下例所示),您将体验到正确的行为:
val route = get {
parameters(('$top.as[Int].?, '$skip.as[Int].?)) {
(top, skip) => complete(s"$top, $skip")
}
}