ホームページ  >  記事  >  Java  >  包括的なリクエスト/レスポンスのログを使用して Spring RestTemplate のデバッグを強化するにはどうすればよいでしょうか?

包括的なリクエスト/レスポンスのログを使用して Spring RestTemplate のデバッグを強化するにはどうすればよいでしょうか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-11-21 17:00:10637ブラウズ

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

SpringRestTemplate による拡張デバッグ: 包括的なリクエスト/レスポンス ログの有効化

HTTP リクエストの作成に使用される多用途ツールである Spring RestTemplate は、多くの場合、次のような問題を引き起こします。リクエストとレスポンスのデータの可視性が限られているため、デバッグ時に課題が生じます。幸いなことに、これらの障害を克服するためのアプローチがいくつか存在します。

一般的な解決策の 1 つは、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 を追加し、 interceptor:

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

これらの手順により、Java コードで包括的なリクエストとレスポンスのログにアクセスできるようになり、ネットワーク相互作用の効率的なデバッグとトラブルシューティングが可能になります。

以上が包括的なリクエスト/レスポンスのログを使用して Spring RestTemplate のデバッグを強化するにはどうすればよいでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。