кодировка URL-адресов в java имеет проблемы с апострофом и пробелом

#java

Вопрос:

У меня фамилия «Мак-Дональд», и я пытаюсь закодировать ее таким образом, чтобы она работала. Например, кодированное значение в конце должно иметь ‘ для апострофа и пробела. С помощью этого кода он кодируется в «%27». в бд у меня есть Mc’ Donald, поэтому я заменяю первым, чтобы закодировать все это в следующей строке.

 lastName = lastName.replace("amp;apos;", "'");
HttpEntity<String> entity = new HttpEntity<>(getHttpHeaders());
UriComponentsBuilder uriBuilder = UriComponentsBuilder.fromUriString(baseUrl   "/idsearch").queryParam("lastname", URLEncoder.encode(lastName, "UTF-8")).queryParam("dateOfBirth", birthday);
 ResponseEntity<Response> result = restTemplate.exchange(uriBuilder.toUriString(),
                    HttpMethod.GET, entity, Response.class);
 

Как заставить код работать, кодируя апостроф и пробел в ‘ или ‘% 20?

Комментарии:

1. Нет ли ошибки в ваших данных? % это % … ты не перепутал где-нибудь кодировку?

2. Отсев — я изменил вопрос. Не могли бы вы проверить еще раз, пожалуйста?

3. Я думаю, что он снова кодирует % в ‘ в UriBuilder.toUriString()

4. Ты где-то перепутал кодировку..

Ответ №1:

Вам не нужно кодировать URL-адреса для значений, передаваемых в UriComponentsBuilder.queryParam метод. Он уже знает, как кодировать URL-адрес вашего запроса

Просто сделай это:

 lastName = lastName.replace("amp;apos;", "'");
HttpEntity<String> entity = new HttpEntity<>(getHttpHeaders());
UriComponentsBuilder uriBuilder = UriComponentsBuilder.fromUriString(baseUrl   "/idsearch").queryParam("lastname",lastName).queryParam("dateOfBirth", birthday);
 ResponseEntity<Response> result = restTemplate.exchange(uriBuilder.toUriString(),
                    HttpMethod.GET, entity, Response.class);
 

Комментарии:

1. После UriBuilder.toUriString () значение равно ?фамилия=Mc’ дональд и дата рождения=1986-05-09. Не знаю, почему он не кодируется»..

2. и что в этом плохого? это кодирование пространства

3. но не апостроф

4. Поскольку апостроф не является обязательным для кодирования — он может быть передан как в параметрах URL-запроса. Он кодирует только те символы, которые должны быть закодированы. Проверьте JavaDoc UriComponentBuilder.

5. docs.spring.io/spring-framework/docs/current/javadoc-api/org/… говорит, что «кодировка, если она применена, будет кодировать только символы, которые являются незаконными в имени или значении параметра запроса, например «=» или «amp;». Все остальные, которые являются законными в соответствии с правилами синтаксиса в RFC 3986, не кодируются»