Усі ці відповіді видаються неповними та / або наганяють. Дивлячись на інтерфейс RestTemplate, здається, він передбачає ClientHttpRequestFactory
введення в нього, а потім цей requestFactory буде використаний для створення запиту, включаючи будь-які налаштування заголовків, тексту та параметрів запиту.
Вам потрібен універсал ClientHttpRequestFactory
для введення в один спільний ресурс, RestTemplate
або ж вам потрібно отримати новий екземпляр шаблону через new RestTemplate(myHttpRequestFactory)
.
На жаль, створювати таку фабрику виглядає дещо нетривіально, навіть коли ви просто хочете встановити єдиний заголовок авторизації, що досить неприємно, враховуючи, яка загальна вимога, яка, ймовірно, є, але принаймні це дозволяє легко використовувати, якщо, наприклад , ваш заголовок Authorization можна створити з даних, що містяться в Authorization
об'єкті Spring-Security , тоді ви можете створити фабрику, яка встановлює вихідний AuthorizationHeader для кожного запиту, виконуючи, SecurityContextHolder.getContext().getAuthorization()
а потім заповнюючи заголовок, з необхідними перевірками. Тепер усі вихідні дзвінки відпочинку, зроблені за допомогою цього RestTemplate, матимуть правильний заголовок авторизації.
Без особливого акценту на механізмі HttpClientFactory, що забезпечує прості для перевантаження базові класи для таких звичайних випадків, як додавання одного заголовка до запитів, більшість приємних зручних методів в RestTemplate
кінцевому підсумку виявляються марною тратою часу, оскільки їх можна використовувати лише рідко .
Я хотів би побачити щось таке, як це
@Configuration
public class MyConfig {
@Bean
public RestTemplate getRestTemplate() {
return new RestTemplate(new AbstractHeaderRewritingHttpClientFactory() {
@Override
public HttpHeaders modifyHeaders(HttpHeaders headers) {
headers.addHeader("Authorization", computeAuthString());
return headers;
}
public String computeAuthString() {
return SecurityContextHolder.getContext().getAuthorization().getCredential();
}
});
}
}
На даний момент з інтерфейсом доступних ClientHttpRequestFactory важче взаємодіяти, ніж із цим. Ще кращою була б абстрактна обгортка для існуючих заводських реалізацій, яка робить їх схожими на простіший об'єкт, такий як AbstractHeaderRewritingRequestFactory, для цілей заміни лише однієї частини функціональності. Зараз вони мають дуже загальне призначення, так що навіть написання цих обгортків є складним дослідженням.