Menyahpepijat permintaan dan respons HTTP boleh menjadi mencabar apabila menggunakan Spring RestTemplate , kerana ia tidak mempunyai maklumat pengelogan terperinci. Sama seperti mod verbose curl, anda mungkin memerlukan cerapan tentang kedua-dua data yang dihantar dan diterima, termasuk pengepala dan kuki.
Daripada mengubah suai kod sumber RestTemplate, anda boleh menggunakan ClientHttpRequestInterceptor tersuai untuk memintas dan log permintaan dan data tindak balas. Berikut ialah contoh lengkap:
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================================================="); } }
Untuk menggunakan pemintas ini, nyatakan RestTemplate menggunakan BufferingClientHttpRequestFactory dan daftarkan LoggingRequestInterceptor:
RestTemplate restTemplate = new RestTemplate(new BufferingClientHttpRequestFactory(new SimpleClientHttpRequestFactory())); List<ClientHttpRequestInterceptor> interceptors = new ArrayList<>(); interceptors.add(new LoggingRequestInterceptor()); restTemplate.setInterceptors(interceptors);
Penyelesaian ini menyediakan cara yang boleh disesuaikan dan mudah untuk menangkap dan log permintaan dan butiran respons, membantu dalam menyelesaikan masalah dan menyahpepijat komunikasi perkhidmatan web RESTful menggunakan Spring RestTemplate.
Atas ialah kandungan terperinci Bagaimana untuk Mendayakan Pengelogan Penyahpepijatan Lengkap untuk Permintaan dan Respons menggunakan Spring RestTemplate?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!