Как закодировать запятую в spring uricomponentsbuilder?

У меня есть следующий код:

    String convertedBuilder = builder.toUriString();
    convertedBuilder = convertedBuilder.replace(",", "\\,");



    URI uri = UriComponentsBuilder.fromUriString(convertedBuilder)
              .build().toUri();

Идея состоит в том, чтобы заменить одну запятую ',' на '\,' (косая черта и запятая). Исходный URL-адрес должен иметь вид

'server-url'?name=te%5C%2Cst для значения параметра 'te\,st.

Однако Spring генерирует это:

'server-url'?name=te%5C%252Cst

Что я делаю неправильно?

С уважением,

Почему вы хотите кодировать ,? С .build(false) вы можете сказать UriComponentsBuilder, что он не закодирован. Он закодирует ` to % 5C`.

Sotirios Delimanolis 13.09.2018 21:35

@SotiriosDelimanolis, это URL-адрес, предоставленный конечной точкой Salesforce, и я должен отправить им как '% 5C% 2C'

Luís Palma 13.09.2018 21:46

Какова стоимость convertedBuilder перед заменой? Пожалуйста, предоставьте Минимальный, полный и проверяемый пример, потому что я не вижу, чтобы , кодировался как-либо с использованием рассматриваемого кода.

Andreas 13.09.2018 21:54

@Andreas xxxxxx / services / apexrest / EnterpriseObjects /… - это преобразованная строка в билдере.

Luís Palma 13.09.2018 22:02
Невозможно воспроизвести: Когда я запускаю этот код, используя только что указанное вами значение, я получаю https://xxxxxx/services/apexrest/EnterpriseObjects/serviceAc‌​count?name=te%5C,st, то есть без кодирования , при использовании spring-web-4.3.10.RELEASE.jar.
Andreas 13.09.2018 22:09

Да исправить! @Andreas У меня есть то, что у вас есть, хотелось бы теперь, чтобы xxxxxx / services / apexrest / EnterpriseObjects /… был вместо xxxxxx / services / apexrest / EnterpriseObjects /…

Luís Palma 13.09.2018 22:31
URI uri = URI.create(convertedBuilder.replace(",", "%5C%2C"));
Andreas 13.09.2018 22:57
1
7
1 361
2

Ответы 2

How to encode comma in Spring UriComponentsBuilder?

UriComponentsBuilder не кодирует запятую, поскольку RFC не требует ее кодирования. Вам придется кодировать его вручную, как предложил Андреас в комментариях.

However Spring generates this one: 'server-url'?name=te%5C%252Cst

Нет, как также упомянул Андреас. Он кодирует обратную косую черту, но не запятую. Исправьте вопрос, если вам нужна дополнительная информация.

У меня было аналогичное требование, когда мне приходилось вызывать службу с координатами GPS следующим образом:

http://example.com/path?param1=40.678806%2C-73.943244

Один только UriComponentsBuilder:

  • не кодировать , (запятая) в значении параметра
  • закодируйте закодированную запятую, если я уже закодировал параметр с помощью URLEncoder, получив таким образом значение 40.678806%252C-73.943244

Я решил, что явно закодировал параметр запроса с помощью URLEncoder и сообщил UriComponentsBuilder, что URL-адрес уже закодирован:

UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl("http://example.com/path")
        .queryParam("param1" , URLEncoder.encode("40.678806,-73.943244", "UTF-8"));

ResponseEntity<String> resp = template.exchange(
        builder.build(true).toUri(),
        HttpMethod.GET, 
        null, new ParameterizedTypeReference<String> () {}
    );

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