有没有一种方法可以防止Spring Cloud Gateway重新排序查询参数?

时间:2019-06-28 20:52:31

标签: spring-cloud spring-cloud-gateway

Spring Cloud Gateway似乎正在重新排序我的查询参数,以将重复的参数放在一起。

我正在尝试将某些请求路由到我们的第三方系统的端点之一。这些请求包含一些需要按特定顺序排列的查询参数(包括一些重复的参数),或者第三方系统返回500错误,但是在接收到具有正确顺序的参数的初始请求后,Spring Cloud Gateway会重新排序这些参数可以通过参数的第一个实例将重复项放在一起。

示例:

http://some-url.com/a/path/here?foo=bar&anotherParam=paramValue2&aThirdParam=paramValue3&foo=bar

成为:

http://some-url.com/a/path/here?foo=bar&foo=bar&anotherParam=paramValue2&aThirdParam=paramValue3

因为最后一个参数具有相同的名称,所以最后一个参数被移动到了第一个参数。

我需要的实际请求输出是无需更改即可传递查询参数。

1 个答案:

答案 0 :(得分:1)

问题出在UriComponentsBuilder中使用的RouteToRequestFilter中。 UriComponentsBuilder.fromUri(uri)将建立查询参数图。因为这是LinkedMultiValueMap,所以您会看到所使用的查询参数的重新排序。

请注意,RFC3986包含以下内容

  

查询组件包含非分层数据,以及路径组件中的数据(第3.3节),用于标识URI方案和命名权限(如果有)范围内的资源。

因此,我认为Spring Cloud Gateway中不需要修复。

为了在网关中解决此问题,您需要添加一个自定义过滤器,该过滤器可以通过将顺序设置为RouteToRequestFilter来插入RouteToRequestUrlFilter.ROUTE_TO_URL_FILTER_ORDER + 1之后。 看一下RouteToRequestUrlFilter交换如何适应到下游URI。

希望有帮助! :)