Apabila menyahpepijat Spring RestTemplate, memeriksa permintaan dan respons boleh memberikan cerapan yang tidak ternilai. Untuk meniru keluaran verbose perintah curl dengan pilihan "-v", kita perlu mendayakan pengelogan atau penyahpepijatan terperinci untuk RestTemplate.
Satu pendekatan melibatkan pengubahsuaian kod sumber RestTemplate untuk memasukkan pernyataan pengelogan tambahan, tetapi ini tidak disyorkan sebagai penyelesaian utama. Sebaliknya, kami boleh memanfaatkan kuasa ClientHttpRequestInterceptor.
Custom ClientHttpRequestInterceptor untuk Pengelogan Permintaan/Respons
Untuk log kedua-dua butiran permintaan dan respons, kami boleh melaksanakan tersuai 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================================================="); } }
Konfigurasi RestTemplate dengan Buffering dan Interceptor
Untuk menggunakan pemintas tersuai kami, konfigurasikan RestTemplate seperti berikut:
RestTemplate restTemplate = new RestTemplate(new BufferingClientHttpRequestFactory(new SimpleClientHttpRequestFactory())); List<ClientHttpRequestInterceptor> interceptors = new ArrayList<>(); interceptors.add(new LoggingRequestInterceptor()); restTemplate.setInterceptors(interceptors);
Penggunaan dan Output Jangkaan
Dengan konfigurasi ini disediakan, memanggil restTemplate.execute() akan log permintaan dan butiran respons dalam format yang dikehendaki:
restTemplate.put("http://someurl", objectToPut, urlPathValues);
Dan anda akan melihat perkara berikut dalam 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=================================================
Pengelogan terperinci ini memberikan pandangan menyeluruh tentang interaksi RestTemplate, menjadikan penyahpepijatan lebih cekap dan mudah. Dengan mengelakkan pengubahsuaian kod dan memanfaatkan mekanisme kebolehlanjutan yang disediakan, pendekatan ini menawarkan penyelesaian yang bersih dan fleksibel untuk cabaran penyahpepijatan biasa ini.
Atas ialah kandungan terperinci Bagaimana untuk Log Permintaan dan Respons Spring RestTemplate untuk Penyahpepijatan Berkesan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!