> Java > java지도 시간 > 본문

포괄적인 요청/응답 로깅을 사용하여 Spring RestTemplate 디버깅을 어떻게 향상시킬 수 있나요?

Mary-Kate Olsen
풀어 주다: 2024-11-21 17:00:10
원래의
621명이 탐색했습니다.

How can you enhance Spring RestTemplate debugging with comprehensive request/response logging?

SpringRestTemplate을 통한 향상된 디버깅: 포괄적인 요청/응답 로깅 활성화

HTTP 요청을 만드는 데 사용되는 다용도 도구인 Spring RestTemplate은 종종 다음과 같은 포즈를 취합니다. 요청 및 응답 데이터에 대한 제한된 가시성으로 인해 디버깅 시 문제가 발생합니다. 다행스럽게도 이러한 장애물을 극복할 수 있는 여러 가지 접근 방식이 있습니다.

한 가지 일반적인 솔루션은 RestTemplate의 소스 코드 내에 사용자 정의 로깅 문을 구현하는 것이지만 이 접근 방식은 유지 관리 가능성 및 코드 품질 문제가 있으므로 권장되지 않습니다.

또는 ClientHttpRequestInterceptor 인터페이스를 활용하면 더욱 우아하고 확장 가능한 솔루션이 제공됩니다. 이 인터페이스를 구현함으로써 개발자는 자세한 로깅 정보로 요청 및 응답을 추적할 수 있습니다.

다음은 요청 및 응답 추적을 위한 ClientHttpRequestInterceptor의 전체 구현입니다.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

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=================================================");
    }

}
로그인 후 복사

이 인터셉터를 활용하려면 인스턴스화하세요. BufferingClientHttpRequestFactory가 포함된 RestTemplate을 만들고 인터셉터:

RestTemplate restTemplate = new RestTemplate(new BufferingClientHttpRequestFactory(new SimpleClientHttpRequestFactory()));
List<ClientHttpRequestInterceptor> interceptors = new ArrayList<>();
interceptors.add(new LoggingRequestInterceptor());
restTemplate.setInterceptors(interceptors);
로그인 후 복사

이러한 단계를 통해 Java 코드에서 포괄적인 요청 및 응답 로깅에 액세스할 수 있으므로 네트워크 상호 작용의 효율적인 디버깅 및 문제 해결이 가능해집니다.

위 내용은 포괄적인 요청/응답 로깅을 사용하여 Spring RestTemplate 디버깅을 어떻게 향상시킬 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿