[JAVA] Proxy- und Timeout-Einstellungen beim Aufrufen der API mit Spring Rest Template

Ich musste über einen Proxy eine Verbindung herstellen, um eine externe API mit RestTemplete aufzurufen, also habe ich nachgeschlagen.

Nachtrag Es wurde eine Problemumgehung für das Problem hinzugefügt, dass der Text nicht mit der GET-Methode gesendet werden kann.

Ausführung SpringBoot 2.1.6.RELEASE HttpClient 4.5.9

RestTemplateCustomizer-Schnittstelle zum Festlegen von RestTemplate

Implementieren Sie den Einstellungsprozess in der Anpassungsmethode.

Proxy-Einstellungen

Legen Sie den Proxy-Host (Host, Portnummer) in HttpClientBuilder fest. Wenn eine Authentifizierung (Benutzername, Kennwort) erforderlich ist, legen Sie die Anmeldeinformationen in CredentialProvider und in HttpClientBuilder fest.

Timeout-Einstellung

Legen Sie die Timeout-Einstellung in HttpComponentsClientHttpRequestFactory fest.

Klassenweiter Code

RestTemplateConfig.java


import org.apache.http.HttpHost;
import org.apache.http.auth.AuthScope;
import org.apache.http.auth.UsernamePasswordCredentials;
import org.apache.http.impl.client.BasicCredentialsProvider;
import org.apache.http.impl.client.HttpClientBuilder;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.web.client.RestTemplateCustomizer;
import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
import org.springframework.stereotype.Component;
import org.springframework.web.client.RestTemplate;

@Component
public class RestTemplateConfig implements RestTemplateCustomizer {

    @Value("${proxy.host:#{null}}")
    private String proxyHost;

    @Value("${proxy.port:0}")
    private int proxyPort;

    @Value("${proxy.user:#{null}}")
    private String proxyUser;

    @Value("${proxy.password:#{null}}")
    private String proxyPassword;

    @Value("${api.connect.timeout:0}")
    private int connectTimeout;

    @Value("${api.read.timeout:0}")
    private int readTimeout;

    @Override
    public void customize(RestTemplate restTemplate) {

        HttpClientBuilder builder;
        if (proxyHost != null && !proxyHost.isEmpty() && proxyPort != 0) {
            builder = HttpClientBuilder.create().setProxy(new HttpHost(proxyHost, proxyPort));
            if (proxyUser != null && !proxyUser.isEmpty() && proxyPassword != null && !proxyPassword.isEmpty()) {
                AuthScope authScope = new AuthScope(proxyHost, proxyPort);
                UsernamePasswordCredentials usernamePassword = new UsernamePasswordCredentials(proxyUser, proxyPassword);
                BasicCredentialsProvider credentialsProvider = new BasicCredentialsProvider();
                credentialsProvider.setCredentials(authScope, usernamePassword);
                builder.setDefaultCredentialsProvider(credentialsProvider);
            }
        }
        else {
            builder = HttpClientBuilder.create();
        }

        HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory(builder.build());
        if (connectTimeout > 0) {
            requestFactory.setConnectTimeout(connectTimeout);
        }
        if (readTimeout > 0) {
            requestFactory.setReadTimeout(readTimeout);
        }

        restTemplate.setRequestFactory(requestFactory);
    };
}

Ermöglichen Sie das Senden des Körpers mit der GET-Methode

Wenn Sie die Standardeinstellung beibehalten, können Sie den Anforderungshauptteil nicht mit der GET-Methode senden. HttpComponentsClientHttpRequestFactory kann jetzt erweitert werden, um Anforderungskörper mit der GET-Methode zu senden.

Referenz Making a GET request with request body using Spring RestTemplate

        class HttpEntityEnclosingRequest extends HttpEntityEnclosingRequestBase {
            HttpEntityEnclosingRequest(URI uri) {
                setURI(uri);
            }
            @Override
            public String getMethod() {
                return HttpMethod.GET.name();
            }
        }

        HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory(builder.build()) {
            @Override
            protected HttpUriRequest createHttpUriRequest(HttpMethod httpMethod, URI uri) {
                if (httpMethod == HttpMethod.GET) {
                    return new HttpEntityEnclosingRequest(uri);
                }
                return super.createHttpUriRequest(httpMethod, uri);
            }
        };

Recommended Posts

Proxy- und Timeout-Einstellungen beim Aufrufen der API mit Spring Rest Template
Einstellungen beim Aufrufen der API mithilfe von CSRF-Maßnahmen von Spring Security in JMeter
Implementieren Sie die REST-API mit Spring Boot
Führen Sie swagger-ui in die in Spring Boot implementierte REST-API ein
Implementieren Sie die REST-API mit Spring Boot und JPA (Application Layer).
Implementieren Sie die REST-API mit Spring Boot und JPA (Infrastructure Layer).
Aufrufen und Verwenden der API in Java (Spring Boot)
Erstellen Sie eine API zum Senden und Empfangen von Json-Daten mit Spring
Implementieren Sie die REST-API mit Spring Boot und JPA (Domain Layer Edition).
Feder mit Kotorin --4 REST API Design
So übergeben Sie einen Proxy, wenn Sie REST mit SSL in Java auslösen