>Java >java지도 시간 >효과적인 디버깅을 위해 Spring RestTemplate 요청 및 응답을 기록하는 방법은 무엇입니까?

효과적인 디버깅을 위해 Spring RestTemplate 요청 및 응답을 기록하는 방법은 무엇입니까?

Susan Sarandon
Susan Sarandon원래의
2024-11-19 01:51:021051검색

How to Log Spring RestTemplate Requests and Responses for Effective Debugging?

Spring RestTemplate 요청 및 응답 디버깅: 종합 가이드

Spring RestTemplate을 디버깅할 때 요청과 응답을 검사하면 귀중한 통찰력을 얻을 수 있습니다. "-v" 옵션을 사용하여 컬 명령의 자세한 출력을 복제하려면 RestTemplate에 대한 자세한 로깅 또는 디버깅을 활성화해야 합니다.

한 가지 접근 방식은 추가 로깅 문을 포함하도록 RestTemplate의 소스 코드를 수정하는 것이지만, 이는 기본 솔루션으로 권장되지 않습니다. 대신 ClientHttpRequestInterceptor의 기능을 활용할 수 있습니다.

요청/응답 로깅을 위한 사용자 정의 ClientHttpRequestInterceptor

요청 및 응답 세부 정보를 모두 기록하려면 사용자 정의 ClientHttpRequestInterceptor를 구현할 수 있습니다.

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.HttpRequest;
import org.springframework.http.client.ClientHttpRequestExecution;
import org.springframework.http.client.ClientHttpRequestInterceptor;
import org.springframework.http.client.ClientHttpResponse;

public class LoggingRequestInterceptor implements ClientHttpRequestInterceptor {

    final static Logger log = LoggerFactory.getLogger(LoggingRequestInterceptor.class);

    @Override
    public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution) throws IOException {
        traceRequest(request, body);
        ClientHttpResponse response = execution.execute(request, body);
        traceResponse(response);
        return response;
    }

    private void traceRequest(HttpRequest request, byte[] body) throws IOException {
        log.info("===========================request begin================================================");
        log.debug("URI         : {}", request.getURI());
        log.debug("Method      : {}", request.getMethod());
        log.debug("Headers     : {}", request.getHeaders());
        log.debug("Request body: {}", new String(body, "UTF-8"));
        log.info("==========================request end================================================");
    }

    private void traceResponse(ClientHttpResponse response) throws IOException {
        StringBuilder inputStringBuilder = new StringBuilder();
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(response.getBody(), "UTF-8"));
        String line = bufferedReader.readLine();
        while (line != null) {
            inputStringBuilder.append(line);
            inputStringBuilder.append('\n');
            line = bufferedReader.readLine();
        }
        log.info("============================response begin==========================================");
        log.debug("Status code  : {}", response.getStatusCode());
        log.debug("Status text  : {}", response.getStatusText());
        log.debug("Headers      : {}", response.getHeaders());
        log.debug("Response body: {}", inputStringBuilder.toString());
        log.info("=======================response end=================================================");
    }

}

RestTemplate 구성 버퍼링 및 인터셉터

사용자 정의 인터셉터를 사용하려면 RestTemplate을 다음과 같이 구성하세요.

RestTemplate restTemplate = new RestTemplate(new BufferingClientHttpRequestFactory(new SimpleClientHttpRequestFactory()));
List<ClientHttpRequestInterceptor> interceptors = new ArrayList<>();
interceptors.add(new LoggingRequestInterceptor());
restTemplate.setInterceptors(interceptors);

인터셉터가 응답 본문에 여러 번 액세스할 수 있도록 하려면 BufferingClientHttpRequestFactory가 필요합니다. .

용도 및 예상 출력

이 구성이 적용된 상태에서 RestTemplate.execute()를 호출하면 요청 및 응답 세부 정보가 원하는 형식으로 기록됩니다.

restTemplate.put("http://someurl", objectToPut, urlPathValues);

그리고 다음 내용이 표시됩니다. 로그:

===========================request begin===============================================
URI         : http://someurl
Method      : PUT
Headers     : {...}
Request body: {...}
==========================request end===============================================

============================response begin==========================================
Status code  : 200
Status text  : OK
Headers      : {...}
Response body: {...}
=======================response end=================================================

이 상세한 로깅은 RestTemplate의 상호 작용에 대한 포괄적인 보기를 제공하여 디버깅을 훨씬 더 효율적이고 편리하게 만듭니다. 코드 수정을 방지하고 제공된 확장성 메커니즘을 활용함으로써 이 접근 방식은 이러한 일반적인 디버깅 문제에 대한 깔끔하고 유연한 솔루션을 제공합니다.

위 내용은 효과적인 디버깅을 위해 Spring RestTemplate 요청 및 응답을 기록하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.