복붙노트

[SPRING] RestTemplate은 URL을 이스케이프 처리하지 않습니다.

SPRING

RestTemplate은 URL을 이스케이프 처리하지 않습니다.

나는 Spring RestTemplate을 다음과 같이 성공적으로 사용하고있다.

String url = "http://example.com/path/to/my/thing/{parameter}";
ResponseEntity<MyClass> response = restTemplate.postForEntity(url, payload, MyClass.class, parameter);

그리고 그것은 좋다.

그러나 때때로 매개 변수가 % 2F입니다. 나는 이것이 이상적이 아니라는 것을 안다. 그러나 그것은 그것이 무엇인지이다. 올바른 URL은 http://example.com/path/to/my/thing/%2F이어야하지만 매개 변수를 "% 2F"로 설정하면 이중으로 이스케이프 처리되어 http://example.com/path/to가됩니다. / my / thing / % 252F. 어떻게 이것을 막을 수 있습니까?

해결법

  1. ==============================

    1.String URL을 사용하는 대신 UriComponentsBuilder를 사용하여 URI를 작성하십시오.

    String URL을 사용하는 대신 UriComponentsBuilder를 사용하여 URI를 작성하십시오.

    String url = "http://example.com/path/to/my/thing/";
    String parameter = "%2F";
    UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(url).path(parameter);
    UriComponents components = builder.build(true);
    URI uri = components.toUri();
    System.out.println(uri); // prints "http://example.com/path/to/my/thing/%2F"
    

    UriComponentsBuilder # build (boolean)를 사용하여

    이는 {parameter}를 대체하고 직접 URI 객체를 만드는 것과 거의 같습니다.

    String url = "http://example.com/path/to/my/thing/{parameter}";
    url = url.replace("{parameter}", "%2F");
    URI uri = new URI(url);
    System.out.println(uri);
    

    그런 다음이 URI 객체를 postForObject 메소드의 첫 번째 인수로 사용할 수 있습니다.

  2. ==============================

    2.나머지 템플리트에 이미 URI를 인코딩했다는 것을 알릴 수 있습니다. 이 작업은 UriComponentsBuilder.build (true)를 사용하여 수행 할 수 있습니다. 이 방법은 휴식 템플릿은 uri를 탈출하려고하지 않습니다. 대부분의 나머지 템플리트 api는 첫 번째 인수로 URI를 승인합니다.

    나머지 템플리트에 이미 URI를 인코딩했다는 것을 알릴 수 있습니다. 이 작업은 UriComponentsBuilder.build (true)를 사용하여 수행 할 수 있습니다. 이 방법은 휴식 템플릿은 uri를 탈출하려고하지 않습니다. 대부분의 나머지 템플리트 api는 첫 번째 인수로 URI를 승인합니다.

    String url = "http://example.com/path/to/my/thing/{parameter}";
    url = url.replace("{parameter}", "%2F");
    UriComponentsBuilder builder = UriComponentsBuilder.fromUriString(url);
    // Indicate that the components are already escaped
    URI uri = builder.build(true).toUri();
    ResponseEntity<MyClass> response = restTemplate.postForEntity(uri, payload, MyClass.class, parameter);
    
  3. from https://stackoverflow.com/questions/28182836/resttemplate-to-not-escape-url by cc-by-sa and MIT license