Есть ли способ предотвратить изменение порядка запросов в Spring Cloud Gateway? - PullRequest
0 голосов
/ 28 июня 2019

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 Ответ

1 голос
/ 11 июля 2019

Проблема лежит в UriComponentsBuilder, который используется в RouteToRequestFilter. UriComponentsBuilder.fromUri(uri) собирается создать карту параметров запроса. Поскольку это LinkedMultiValueMap, вы видите переупорядочение используемых параметров запроса.

Обратите внимание, что RFC3986 содержит следующее

Компонент запроса содержит неиерархические данные, которые наряду с данными в компоненте пути (раздел 3.3) служат для идентификации ресурса в рамках схемы URI и полномочий по присвоению имен (если таковые имеются).

Поэтому я не думаю, что в Spring Cloud Gateway нужно что-то исправлять.

Чтобы исправить это в вашем шлюзе, вам нужно добавить пользовательский фильтр, который срабатывает после RouteToRequestFilter, установив порядок на RouteToRequestUrlFilter.ROUTE_TO_URL_FILTER_ORDER + 1. Взгляните на RouteToRequestUrlFilter, как обмен адаптирован для перехода к нижестоящему URI.

Надеюсь, это поможет! :)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...