[JAVA] Paramètres de proxy et de délai d'expiration lors de l'appel de l'API avec le modèle Spring Rest

J'ai dû me connecter via un proxy pour appeler une API externe à l'aide de RestTemplete, alors je l'ai recherchée.

Postscript Ajout d'une solution de contournement pour le problème de ne pas pouvoir envoyer le corps avec la méthode GET.

version SpringBoot 2.1.6.RELEASE HttpClient 4.5.9

Interface RestTemplateCustomizer pour la configuration de RestTemplate

Implémentez le processus de paramétrage dans la méthode de personnalisation.

Paramètres du proxy

Définissez l'hôte proxy (hôte, numéro de port) dans HttpClientBuilder. Si l'authentification (nom d'utilisateur, mot de passe) est requise, définissez les informations d'identification dans CredentialProvider et définissez-les dans HttpClientBuilder.

Réglage du délai d'expiration

Définissez le paramètre de délai d'expiration dans HttpComponentsClientHttpRequestFactory.

Code à l'échelle de la classe

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);
    };
}

Autoriser l'envoi du corps avec la méthode GET

Si vous conservez la valeur par défaut, vous ne pouvez pas envoyer le corps de la requête avec la méthode GET. HttpComponentsClientHttpRequestFactory a été étendu afin que le corps de la requête puisse être envoyé avec la méthode GET.

référence 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

Paramètres de proxy et de délai d'expiration lors de l'appel de l'API avec le modèle Spring Rest
Paramètres lors de l'appel de l'API à l'aide des mesures CSRF de Spring Security dans JMeter
Implémenter l'API REST avec Spring Boot
Présentez swagger-ui à l'API REST implémentée dans Spring Boot
Implémenter l'API REST avec Spring Boot et JPA (Application Layer)
Implémenter l'API REST avec Spring Boot et JPA (couche d'infrastructure)
Comment appeler et utiliser l'API en Java (Spring Boot)
Créez une API pour envoyer et recevoir des données Json avec Spring
Implémenter l'API REST avec Spring Boot et JPA (Domain Layer Edition)
Spring avec Kotorin - 4 Conception d'API REST
Comment passer un proxy lors du lancement de REST avec SSL en Java