RestTemplate.exchange() будет кодировать все недопустимые символы в URL, но не +, поскольку + является допустимым символом URL. Но как передать + в любой параметр запроса URL?




Если URI, который вы передаете в RestTemplate, закодирован как true, он не будет выполнять кодирование для URI, который вы передаете, иначе это будет.
import java.io.UnsupportedEncodingException;
import java.net.URI;
import java.net.URLEncoder;
import java.util.Collections;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.ResponseEntity;
import org.springframework.http.client.BufferingClientHttpRequestFactory;
import org.springframework.http.client.SimpleClientHttpRequestFactory;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.util.UriComponentsBuilder;
class Scratch {
public static void main(String[] args) {
RestTemplate rest = new RestTemplate(
new BufferingClientHttpRequestFactory(new SimpleClientHttpRequestFactory()));
HttpHeaders headers = new HttpHeaders();
headers.add("Content-Type", "application/json");
headers.add("Accept", "application/json");
HttpEntity<String> requestEntity = new HttpEntity<>(headers);
UriComponentsBuilder builder = null;
try {
builder = UriComponentsBuilder.fromUriString("http://example.com/endpoint")
.queryParam("param1", URLEncoder.encode("abc+123 = ", "UTF-8"));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
URI uri = builder.build(true).toUri();
ResponseEntity responseEntity = rest.exchange(uri, HttpMethod.GET, requestEntity, String.class);
}
}
Поэтому, если вам нужно передать параметр запроса с + в нем, RestTemplate не будет кодировать +, а будет кодировать любой другой недопустимый символ URL-адреса, поскольку + является допустимым символом URL-адреса. Следовательно, вы должны сначала закодировать параметр (URLEncoder.encode("abc+123 = ", "UTF-8")), а затем передать закодированный параметр в RestTemplate, указав, что URI уже закодирован с использованием builder.build(true).toUri();, где true сообщает RestTemplate, что URI уже закодирован, чтобы не кодировать снова и, следовательно, + передаваться как %2B.
builder.build(true).toUri();
ВЫХОД: http://example.com/endpoint?param1=abc%2B123%3D, поскольку кодирование будет выполнено один раз.builder.build().toUri();
ВЫХОД: http://example.com/endpoint?param1=abc%252B123%253D, поскольку кодировка будет выполнена дважды.Glat это помогло вам.
У меня была такая же проблема, и ваш ответ помог мне решить мою проблему.