Как исправить проблемы, связанные с URLEncoder?

У меня проблемы с кодировщиком URL-адресов, он работает локально и на сцене, но не работает в реальном времени.

Я использую фильтры для получения названий брендов, но в некоторых названиях есть пробелы. Когда я отправляю запрос в реальном времени, он возвращает ошибку 500.

java.net.URISyntaxException: недопустимый символ в запросе по индексу 236:
http://gateway-service/deal-solution-service/api/deals?categories=false&phonesAndSim=false&lteAndSim=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-адрес, чтобы заполнить пробелы.

Кодировать следует коллекцию, а не только отдельные бренды. IOW, вам следует закодировать всю «значительную» часть аргумента, а также и «ключевую» часть, и для всех аргументов, а не только для этого.

user207421 12.03.2024 10:38

Вы говорите, что получаете исключение java.net.URISyntaxException. Но в вашем коде не отображается код, который вызовет это исключение. Итак, эта конкретная ошибка возникает откуда-то еще. Вы проверили трассировку стека?

mstrewe 12.03.2024 11:32
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
2
61
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Судя по описанию и фрагментам, ваш подход к кодированию URL кажется более-менее правильным. Ошибка, которую вы видите, указывает на проблему с кодированием пробелов.

При кодировании такой строки, как «Huawei Spa», пробелы следует заменять на «+» или «%20». Вы можете закодировать его здесь и протестировать в своей среде.

Тот факт, что он работает локально, а не в рабочей среде, может указывать на несоответствие в том, как URL-адреса интерпретируются в этих средах. Такое поведение может быть вызвано всем, что находится между клиентом и приложением, включая сервер, обратные прокси-серверы и другие конфигурации.

Для получения справки по URLEncoder обратитесь к официальной документации

Это неправильно. Он кодирует один элемент, а затем формирует коллекцию, вместо того, чтобы формировать коллекцию и затем кодировать ее.

user207421 12.03.2024 12:02

Спасибо, проблема была в частной строке URIComponentBuilder buildUri(final ProxyExchange<?> proxy, Final MultiValueMap<String, String> queryParams) { return UriComponentsBuilder.fromUriString(rewritePath(proxy)) .queryParams(queryParams).build() .toUriString (); }

Esphi01 13.03.2024 07:35

Другие вопросы по теме