복붙노트

[SPRING] 쿠키로 RestTemplate 클라이언트

SPRING

쿠키로 RestTemplate 클라이언트

Java에서 간단한 클라이언트를 작성하여 RESTful API를 통해 액세스 할 수있는 독점적 인 바이러스 검색 소프트웨어를 재사용 할 수있게했습니다. API를 스캔하기 위해 파일을 업로드하려면 Connect에 대한 POST와 파일을 서버에 게시하기위한 POST가 필요합니다. Connect POST에 대한 응답에는 파일을 게시하기 위해 후속 POST에 있어야하는 서버에 의해 설정된 쿠키가 있습니다. 저는 현재 클라이언트에서 Spring RestTemplate을 사용하고 있습니다.

내 질문은 후속 POST로 서버로 전달하기 위해 응답에서 쿠키에 어떻게 액세스합니까? 반환 된 헤더에 해당 메시지가 있음을 알 수 있지만 ResponseEntity에 액세스하는 메소드가 없습니다.

해결법

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

    1.RestTemplate에는 인터페이스 ResponseExtractor 를 정의 할 수있는 메소드가 있습니다.이 인터페이스는 응답의 헤더를 가져 오는 데 사용됩니다. 응답 헤더는 HttpEntity를 사용하여 다시 보내고 다시 추가 할 수 있습니다.

    RestTemplate에는 인터페이스 ResponseExtractor 를 정의 할 수있는 메소드가 있습니다.이 인터페이스는 응답의 헤더를 가져 오는 데 사용됩니다. 응답 헤더는 HttpEntity를 사용하여 다시 보내고 다시 추가 할 수 있습니다.

     .add("Cookie", "SERVERID=c52");
    

    이런 식으로 해보십시오.

    String cookieHeader = null;
    
    new ResponseExtractor<T>(){
          T extractData(ClientHttpResponse response) {
            response.getHeaders();
          }
    }
    

    그때

      HttpHeaders headers = new HttpHeaders();
      headers.add("Cookie", cookieHeader );
    
      ResponseEntity<byte[]> response = restTemplate.exchange("http://example.com/file/123",
          GET,
          new HttpEntity<String>(headers),
          byte[].class);
    

    이 게시물을 읽으십시오.

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

    2.Java Spring framework RestTemplate의 교환 방법을 사용할 필요가 있습니다.

    Java Spring framework RestTemplate의 교환 방법을 사용할 필요가 있습니다.

    이 자습서 읽기 : http://codeflex.co/java-rest-client-get-cookie/

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

    3.'java.net.HttpCookie'객체를 사용하여 전체 테스트에서 세션을 처리하는 작은 업데이트.

    'java.net.HttpCookie'객체를 사용하여 전체 테스트에서 세션을 처리하는 작은 업데이트.

    @Hands shades

    import java.io.IOException;
    import java.net.HttpCookie;
    import java.net.URI;
    import java.util.ArrayList;
    import java.util.List;
    import org.springframework.http.HttpHeaders;
    import org.springframework.http.HttpMethod;
    import org.springframework.http.client.ClientHttpRequest;
    import org.springframework.http.client.ClientHttpRequestFactory;
    import org.springframework.http.client.ClientHttpResponse;
    import org.springframework.stereotype.Component;
    import org.springframework.web.client.RequestCallback;
    import org.springframework.web.client.ResponseExtractor;
    import org.springframework.web.client.RestClientException;
    import org.springframework.web.client.RestTemplate;
    
    /**
     * @link https://stackoverflow.com/questions/22853321/resttemplate-client-with-cookies
     */
    @Component
    public class RestTemplateWithCookies extends RestTemplate {
    
        private final List<HttpCookie> cookies = new ArrayList<>();
    
        public RestTemplateWithCookies() {
        }
    
        public RestTemplateWithCookies(ClientHttpRequestFactory requestFactory) {
            super(requestFactory);
        }
    
        public synchronized List<HttpCookie> getCoookies() {
            return cookies;
        }
    
        public synchronized void resetCoookies() {
            cookies.clear();
        }
    
        private void processHeaders(HttpHeaders headers) {
            final List<String> cooks = headers.get("Set-Cookie");
            if (cooks != null && !cooks.isEmpty()) {
                cooks.stream().map((c) -> HttpCookie.parse(c)).forEachOrdered((cook) -> {
                    cook.forEach((a) -> {
                        HttpCookie cookieExists = cookies.stream().filter(x -> a.getName().equals(x.getName())).findAny().orElse(null);
                        if (cookieExists != null) {
                            cookies.remove(cookieExists);
                        }
                        cookies.add(a);
                    });
                });
            }
        }
    
        @Override
        protected <T extends Object> T doExecute(URI url, HttpMethod method, final RequestCallback requestCallback, final ResponseExtractor<T> responseExtractor) throws RestClientException {
            final List<HttpCookie> cookies = getCoookies();
    
            return super.doExecute(url, method, new RequestCallback() {
                @Override
                public void doWithRequest(ClientHttpRequest chr) throws IOException {
                    if (cookies != null) {
                        StringBuilder sb = new StringBuilder();
                        for (HttpCookie cookie : cookies) {
                            sb.append(cookie.getName()).append(cookie.getValue()).append(";");
                        }
                        chr.getHeaders().add("Cookie", sb.toString());
                    }
                    requestCallback.doWithRequest(chr);
                }
    
            }, new ResponseExtractor<T>() {
                @Override
                public T extractData(ClientHttpResponse chr) throws IOException {
                    processHeaders(chr.getHeaders());
                    return responseExtractor.extractData(chr);
                }
            });
        }
    
    }
    
  4. ==============================

    4.RestTemplate을 확장하고 쿠키를 처리하는 간단한 클래스를 작성했습니다.

    RestTemplate을 확장하고 쿠키를 처리하는 간단한 클래스를 작성했습니다.

    import java.io.IOException;
    import java.net.URI;
    import java.util.List;
    import org.springframework.http.HttpHeaders;
    import org.springframework.http.HttpMethod;
    import org.springframework.http.client.ClientHttpRequest;
    import org.springframework.http.client.ClientHttpRequestFactory;
    import org.springframework.http.client.ClientHttpResponse;
    import org.springframework.web.client.RequestCallback;
    import org.springframework.web.client.ResponseExtractor;
    import org.springframework.web.client.RestClientException;
    import org.springframework.web.client.RestTemplate;
    
    public class RestTemplateWithCookies extends RestTemplate {
    
        private List<String> cookies = null;
    
        public RestTemplateWithCookies() {
        }
    
        public RestTemplateWithCookies(ClientHttpRequestFactory requestFactory) {
            super(requestFactory);
        }
    
        private synchronized List<String> getCoookies() {
            return cookies;
        }
    
        private synchronized void setCoookies(List<String> cookies) {
            this.cookies = cookies;
        }
    
        public synchronized void resetCoookies() {
            this.cookies = null;
        }
    
        private void processHeaders(HttpHeaders headers) {
            final List<String> cookies = headers.get("Set-Cookie");
            if (cookies != null && !cookies.isEmpty()) {
                setCoookies(cookies);
            }
        }
    
        @Override
        protected <T extends Object> T doExecute(URI url, HttpMethod method, final RequestCallback requestCallback, final ResponseExtractor<T> responseExtractor) throws RestClientException {
            final List<String> cookies = getCoookies();
    
            return super.doExecute(url, method, new RequestCallback() {
                @Override
                public void doWithRequest(ClientHttpRequest chr) throws IOException {
                    if(cookies != null) {
                        for(String cookie : cookies) {
                            chr.getHeaders().add("Cookie", cookie);
                        }
                    }
                    requestCallback.doWithRequest(chr);
                }
    
            }, new ResponseExtractor<T>() {
                @Override
                public T extractData(ClientHttpResponse chr) throws IOException {
                    processHeaders(chr.getHeaders());
                    return responseExtractor.extractData(chr);
                }
            });
        }
    
    }
    
  5. ==============================

    5.쿠키를 저장하고 다음 요청에 넣는 인터셉터를 생성하여이 문제를 해결했습니다.

    쿠키를 저장하고 다음 요청에 넣는 인터셉터를 생성하여이 문제를 해결했습니다.

    public class StatefulRestTemplateInterceptor implements ClientHttpRequestInterceptor {
        private String cookie;
    
        @Override
        public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution) throws IOException {
            if (cookie != null) {
                request.getHeaders().add(HttpHeaders.COOKIE, cookie);
            }
            ClientHttpResponse response = execution.execute(request, body);
    
            if (cookie == null) {
                cookie = response.getHeaders().getFirst(HttpHeaders.SET_COOKIE);
            }
            return response;
        }
    }
    

    그런 다음 RestTemplate의 인터셉터 목록에 넣으십시오.

    @Bean
    public RestTemplate restTemplate(RestTemplateBuilder templateBuilder) {
        return templateBuilder
                .requestFactory(new BufferingClientHttpRequestFactory(new HttpComponentsClientHttpRequestFactory()))
                .interceptors(new StatefulRestTemplateInterceptor())
                .build();
    }
    
  6. from https://stackoverflow.com/questions/22853321/resttemplate-client-with-cookies by cc-by-sa and MIT license