Я сослался на множество SO-ссылок, чтобы сделать следующее.
- RestTemplate установил тайм-аут чтения и соединения
- RestTemplate регистрирует ответы на запросы
Для этого япопробовал приведенные ниже коды.
Попытка 1: для установки таймаута чтения и подключения я пробовал решение ниже.
@Component
public class RestTemplateInitializer implements ApplicationListener<ApplicationReadyEvent> {
@Value("${my.api.timeout}")
private int myTimeOut;
public static HttpComponentsClientHttpRequestFactory clientHttpRequestFactory = new HttpComponentsClientHttpRequestFactory();
@Override
public void onApplicationEvent(ApplicationReadyEvent arg0) {
clientHttpRequestFactory.setConnectTimeout(myTimeOut);
clientHttpRequestFactory.setReadTimeout(myTimeOut);
}
}
И для создания RestTemplate, я пробовал как ниже.
RestTemplate restTemplate = new RestTemplate(RestTemplateInitializer.clientHttpRequestFactory);
Попытка 2: ведение журнала запросов-ответов.
public class RequestResponseLoggingInterceptor implements ClientHttpRequestInterceptor {
private LoggerUtil log = LoggerUtil.getInstance();
private final String className = "RequestResponseLoggingInterceptor";
@Override
public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution) throws IOException
{
logRequest(request, body);
ClientHttpResponse response = execution.execute(request, body);
logResponse(response);
//Add optional additional hostHeaders
response.getHeaders().add("headerName", "VALUE");
return response;
}
private void logRequest(HttpRequest request, byte[] body) throws IOException {
final String methodName = "logRequest";
log.doLog(4, className, methodName, "===========================request begin================================================");
log.doLog(4, className, methodName, "URI : {}"+request.getURI());
log.doLog(4, className, methodName, "Method : {}"+request.getMethod());
log.doLog(4, className, methodName, "Headers : {}"+request.getHeaders());
log.doLog(4, className, methodName, "Request body: {}"+new String(body, "UTF-8"));
log.doLog(4, className, methodName, "==========================request end================================================");
}
private void logResponse(ClientHttpResponse response) throws IOException {
final String methodName = "logResponse";
log.doLog(4, className, methodName, "============================response begin==========================================");
log.doLog(4, className, methodName, "Status code : {}"+response.getStatusCode());
log.doLog(4, className, methodName, "Status text : {}"+response.getStatusText());
log.doLog(4, className, methodName, "Headers : {}"+response.getHeaders());
log.doLog(4, className, methodName, "Response body: {}"+StreamUtils.copyToString(response.getBody(), Charset.defaultCharset()));
log.doLog(4, className, methodName, "=======================response end=================================================");
}
}
А для создания RestTemplate я пробовал, как показано ниже.
RestTemplate restTemplate = new RestTemplate(new BufferingClientHttpRequestFactory(new SimpleClientHttpRequestFactory()));
restTemplate.getInterceptors().add(new RequestResponseLoggingInterceptor());
restTemplate.getInterceptors().add(new BasicAuthenticationInterceptor("Test", "Test"));
проблема с вышеупомянутыми двумя решениями, я не могу смешать и сопоставить эти два.то есть я не могу установить время ожидания чтения и подключения при ведении журнала ответа на запрос, потому что new BufferingClientHttpRequestFactory(new SimpleClientHttpRequestFactory())
не позволяет мне установить время ожидания чтения и подключения.И когда я использую new RestTemplate(RestTemplateInitializer.clientHttpRequestFactory)
, я не могу прочитать ответ дважды.
Есть ли у нас решение, которое делает обе вещи?Заранее спасибо!!
приветствует программирование !!