У меня проблемы с кодировщиком URL-адресов, он работает локально и на сцене, но не работает в реальном времени.
Я использую фильтры для получения названий брендов, но в некоторых названиях есть пробелы. Когда я отправляю запрос в реальном времени, он возвращает ошибку 500.
java.net.URISyntaxException: недопустимый символ в запросе по индексу 236:
http://gateway-service/deal-solution-service/api/deals?categories=false&phonesAndSim=false<eAndSim=false&tabletsAndLaptops=false&connectivity=false&priceMin=0&priceMax=50000&duration36=false&duration24=false&brand=Huawei спа
Об этом должен был позаботиться «Huawei Spa».
мой сервисImpl:
@Override
public Collection<String> getDistinctBrands(Filter1 productFilter) {
List<String> distinctBrands = new ArrayList<>();
if (productFilter != null && productFilter.getBrand() != null && !productFilter.getBrand().isEmpty()) {
String encodedBrand = URLEncoder.encode(productFilter.getBrand(), StandardCharsets.UTF_8);
distinctBrands.addAll(Arrays.asList(encodedBrand.split("[^a-zA-Z0-9\\-_']+")));
} else {
distinctBrands = dealRepository.findDistinctBrands();
}
return distinctBrands;
}
мой контроллер:
@Override
public ResponseEntity<List<String>> getDistinctBrands(Filter1 filter) {
Collection<String> distinctBrands = dealService.getDistinctBrands(filter);
if (!distinctBrands.isEmpty()) {
List<String> decodedBrands = new ArrayList<>();
for (String brand : distinctBrands) {
decodedBrands.add(URLDecoder.decode(brand, StandardCharsets.UTF_8));
}
return ResponseEntity.ok(decodedBrands);
} else {
return ResponseEntity.notFound().build();
}
}
У меня были проблемы при использовании фильтров (фильтрация по названию бренда с пробелами), затем я добавил кодировщик URL-адресов, и он начал работать локально и в промежуточной среде, но по-прежнему не работал в реальном времени.
Если название моего бренда содержит пробелы, я хочу закодировать свой URL-адрес, чтобы заполнить пробелы.
Вы говорите, что получаете исключение java.net.URISyntaxException. Но в вашем коде не отображается код, который вызовет это исключение. Итак, эта конкретная ошибка возникает откуда-то еще. Вы проверили трассировку стека?




Судя по описанию и фрагментам, ваш подход к кодированию URL кажется более-менее правильным. Ошибка, которую вы видите, указывает на проблему с кодированием пробелов.
При кодировании такой строки, как «Huawei Spa», пробелы следует заменять на «+» или «%20». Вы можете закодировать его здесь и протестировать в своей среде.
Тот факт, что он работает локально, а не в рабочей среде, может указывать на несоответствие в том, как URL-адреса интерпретируются в этих средах. Такое поведение может быть вызвано всем, что находится между клиентом и приложением, включая сервер, обратные прокси-серверы и другие конфигурации.
Для получения справки по URLEncoder обратитесь к официальной документации
Это неправильно. Он кодирует один элемент, а затем формирует коллекцию, вместо того, чтобы формировать коллекцию и затем кодировать ее.
Спасибо, проблема была в частной строке URIComponentBuilder buildUri(final ProxyExchange<?> proxy, Final MultiValueMap<String, String> queryParams) { return UriComponentsBuilder.fromUriString(rewritePath(proxy)) .queryParams(queryParams).build() .toUriString (); }
Кодировать следует коллекцию, а не только отдельные бренды. IOW, вам следует закодировать всю «значительную» часть аргумента, а также и «ключевую» часть, и для всех аргументов, а не только для этого.