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
因为最后一个参数具有相同的名称,所以最后一个参数被移动到了第一个参数。
我需要的实际请求输出是无需更改即可传递查询参数。
答案 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。
希望有帮助! :)