복붙노트

[SPRING] 점프 나머지 템플릿 URL 인코딩

SPRING

점프 나머지 템플릿 URL 인코딩

나는 봄 resttemplate와 간단한 휴식 전화를하려고 :

private void doLogout(String endpointUrl, String sessionId) {
    template.getForObject("http://{enpointUrl}?method=logout&session={sessionId}", Object.class,
            endpointUrl, sessionId);
}

endpointUrl 변수에 service.host.com/api/service.php와 같은 내용이 들어있는 경우

불행하게도, 호출 결과는 org.springframework.web.client.ResourceAccessException가됩니다 : I / O 오류 : service.host.com % 2Fapi % 2Fservice.php

그래서 봄 내 URL을 생성하는 동안 내 endpointUrl 문자열을 인코딩하는 것 같다. 봄이 이것을하는 것을 막을 수있는 간단한 방법이 있습니까?

문안 인사

해결법

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

    1.이렇게하는 쉬운 방법은 없습니다. URI 변수는 대개 하나의 경로 요소 또는 쿼리 문자열 매개 변수를 의미합니다. 여러 요소를 전달하려고합니다.

    이렇게하는 쉬운 방법은 없습니다. URI 변수는 대개 하나의 경로 요소 또는 쿼리 문자열 매개 변수를 의미합니다. 여러 요소를 전달하려고합니다.

    한 가지 해결 방법은 UriTemplate을 사용하여 URI 변수가있는 URL을 생성 한 다음 URL 디코드 한 다음 RestTemplate으로 전달하는 것입니다.

    String url = "http://{enpointUrl}?method=logout&session={sessionId}";
    URI expanded = new UriTemplate(url).expand(endpointUrl, sessionId); // this is what RestTemplate uses 
    url = URLDecoder.decode(expanded.toString(), "UTF-8"); // java.net class
    template.getForObject(url, Object.class);
    
  2. ==============================

    2.사용중인 Spring 버전에 따라 다릅니다. 예를 들어 버전 3.0.6.RELEASE와 같이 버전이 너무 오래 되었다면 UriComponentsBuilder와 같은 기능을 스프링 웹 jar와 함께 사용할 수 없습니다.

    사용중인 Spring 버전에 따라 다릅니다. 예를 들어 버전 3.0.6.RELEASE와 같이 버전이 너무 오래 되었다면 UriComponentsBuilder와 같은 기능을 스프링 웹 jar와 함께 사용할 수 없습니다.

    필요한 것은 Spring RestTemplate이 URL을 인코딩하지 못하게하는 것입니다. 당신이 할 수있는 일은 :

    import java.net.URI;
    
    StringBuilder builder = new StringBuilder("http://");
    builder.append(endpointUrl);
    builder.append("?method=logout&session=");
    builder.append(sessionId);
    
    URI uri = URI.create(builder.toString());
    restTemplate.getForObject(uri, Object.class);
    

    나는 Spring version 3.0.6.RELEASE로 테스트했고, 작동한다.

    한마디로, restTemplate.getForObject (String url, Object.class)를 사용하는 대신 restTemplate.getForObject (java.net.URI uri, Object.class)를 사용하십시오.

    Spring 문서의 rest-resttemplate-uri 섹션보기

  3. ==============================

    3.대신에 java.net.URI를 사용하는 오버로드 된 변형을 사용할 수 있습니다.     public T getForObject (URI url, Class responseType)는 RestClientException를 슬로우합니다.

    대신에 java.net.URI를 사용하는 오버로드 된 변형을 사용할 수 있습니다.     public T getForObject (URI url, Class responseType)는 RestClientException를 슬로우합니다.

    Spring의 문서에서

    UriComponents uriComponents =
        UriComponentsBuilder.fromUriString("http://example.com/hotels/{hotel}/bookings/{booking}").build()
            .expand("42", "21")
            .encode();
    
    URI uri = uriComponents.toUri();
    
  4. ==============================

    4.모든 HttpMethod 및 ResponseType의 헤더, 본문에 대한 전체 예제는 다음과 같습니다.

    모든 HttpMethod 및 ResponseType의 헤더, 본문에 대한 전체 예제는 다음과 같습니다.

    String url = "http://google.com/{path}?param1={param1Value}&param2={param2Value}";
    Object body = null;
    HttpEntity request = new HttpEntity(body, new HttpHeaders());
    
    Map<String, String> uriVariables = new HashMap<>();
    uriVariables.put("path", "search");
    uriVariables.put("param1Value", "value1");
    uriVariables.put("param2Value", "value2");
    
    ResponseEntity<Void> responseEntity = restTemplate.exchange(url, HttpMethod.POST, request, Void.class, uriVariables)
    //responseEntity.getBody()
    

    실제로 동일한 UriTemplate 및 확장 메서드를 사용합니다.

  5. from https://stackoverflow.com/questions/20885521/spring-resttemplate-url-encoding by cc-by-sa and MIT license