Spring RestTemplate をデバッグする場合、リクエストとレスポンスを検査すると、貴重な洞察が得られます。 「-v」オプションを使用してcurlコマンドの詳細な出力を複製するには、RestTemplateの詳細なログ記録またはデバッグを有効にする必要があります。
1つの方法では、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);
log:
===========================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 中国語 Web サイトの他の関連記事を参照してください。