Alle diese Antworten scheinen unvollständig und / oder kludges zu sein. Wenn Sie sich die RestTemplate-Oberfläche ansehen, sieht es sicher so aus, als ob eine ClientHttpRequestFactory
Injektion in die Benutzeroberfläche vorgesehen ist. Anschließend wird diese requestFactory zum Erstellen der Anforderung verwendet, einschließlich aller Anpassungen von Headern, Text und Anforderungsparametern.
Sie benötigen entweder ein Universal ClientHttpRequestFactory
, um es in eine einzelne Freigabe einzufügen, RestTemplate
oder Sie müssen eine neue Vorlageninstanz über abrufen new RestTemplate(myHttpRequestFactory)
.
Leider ist es nicht trivial, eine solche Factory zu erstellen, selbst wenn Sie nur einen einzelnen Autorisierungsheader festlegen möchten. Dies ist ziemlich frustrierend, wenn man bedenkt, was für eine häufige Anforderung dies wahrscheinlich ist, aber es ermöglicht zumindest eine einfache Verwendung, wenn beispielsweise Wenn Ihr Authorization-Header aus Daten erstellt werden kann, die in einem Spring-Security- Authorization
Objekt enthalten sind, können Sie eine Factory erstellen, die den ausgehenden AuthorizationHeader für jede Anforderung festlegt, indem Sie SecurityContextHolder.getContext().getAuthorization()
den Header ausführen und dann mit entsprechenden Nullprüfungen füllen. Jetzt haben alle ausgehenden Restaufrufe, die mit diesem RestTemplate getätigt werden, den richtigen Autorisierungsheader.
Ohne mehr Gewicht auf den HttpClientFactory-Mechanismus zu legen, der einfach zu überladende Basisklassen für häufige Fälle wie das Hinzufügen eines einzelnen Headers zu Anforderungen bereitstellt, sind die meisten der nützlichen Methoden RestTemplate
Zeitverschwendung, da sie nur selten verwendet werden können .
Ich würde gerne sehen, dass so etwas Einfaches zur Verfügung gestellt wird
@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();
}
});
}
}
Im Moment ist es schwieriger, mit der Schnittstelle der verfügbaren ClientHttpRequestFactory zu interagieren. Noch besser wäre ein abstrakter Wrapper für vorhandene Factory-Implementierungen, der sie wie ein einfacheres Objekt wie AbstractHeaderRewritingRequestFactory aussehen lässt, um nur diese eine Funktionalität zu ersetzen. Im Moment sind sie sehr allgemein gehalten, so dass selbst das Schreiben dieser Wrapper ein komplexes Stück Forschung ist.