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
Implémentez le processus de paramétrage dans la méthode de personnalisation.
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.
Définissez le paramètre de délai d'expiration dans HttpComponentsClientHttpRequestFactory.
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);
};
}
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