Je pense que certaines entreprises doivent passer par «proxy», qui nécessite une authentification, lors de la connexion à Internet.
Je voudrais expliquer comment définir proxy lors de l'appel d'une API publiée sur Internet à l'aide de Feign, qui est un client API dans un tel environnement.
Feign délègue le processus d'émission d'une requête HTTP à une autre bibliothèque.
En d'autres termes, il vous suffit de prendre en charge le «proxy» de la bibliothèque à utiliser.
Cette fois, changez l 'Sample de Feign pour obtenir les contributeurs du référentiel spécifié de GitHub expliqué sur la page GitHub pour prendre en charge proxy. regarder.
Pour l'explication de Feign, veuillez vous référer à" Feign qui implémente le client API uniquement avec l'interface est très pratique! ".
GitHubDemo.java
package com.example.feign.demo.github;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.Proxy;
import java.util.List;
import java.util.concurrent.TimeUnit;
import feign.Feign;
import feign.jackson.JacksonDecoder;
import okhttp3.Authenticator;
import okhttp3.Credentials;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import okhttp3.Route;
/**
* modify Feign example(https://github.com/OpenFeign/feign) to corresponded proxy
*/
public class GitHubDemo {
public static void main(String[] args) {
// create instance of okhttp3.OkHttpClient corresponded proxy
OkHttpClient client = createOkHttpClientCorrespondedProxy("127.0.0.1",
8080, "userId", "pass");
// feign use proxy with authentication
GitHub github = Feign.builder()
// set instance of feign.Client.OkHttpClient
.client(new feign.okhttp.OkHttpClient(client))
// use Jackson
.decoder(new JacksonDecoder())
.target(GitHub.class, "https://api.github.com");
// call api [GET /repos/{owner}/{repo}/contributors]
List<Contributor> contributors = github.contributors("OpenFeign",
"feign");
for (Contributor contributor : contributors) {
System.out.println(
contributor.login + " (" + contributor.contributions + ")");
}
}
/**
* create instance of okhttp3.OkHttpClient corresponded proxy
* @param proxyHost proxy's host url or ipAddress
* @param proxyPort proxy's port number
* @param userId userId of proxy's authentication
* @param pass pass of proxy's authentication
* @return instance of okhttp3.OkHttpClient
*/
private static OkHttpClient createOkHttpClientCorrespondedProxy(
String proxyHost, int proxyPort, String userId, String pass) {
// okhttp3.Authenticator : correct
// java.net.Authenticator : incorrect
Authenticator proxyAuthenticator = new Authenticator() {
@Override
public Request authenticate(Route route,
Response response) throws IOException {
String credential = Credentials.basic(userId, pass);
return response.request().newBuilder()
.header("Proxy-Authorization", credential).build();
}
};
// okhttp3.OkHttpClient : correct
// feign.Client.OkHttpClient : incorrect
return new OkHttpClient.Builder().connectTimeout(30, TimeUnit.SECONDS)
.writeTimeout(30, TimeUnit.SECONDS)
.readTimeout(30, TimeUnit.SECONDS)
.proxy(new Proxy(Proxy.Type.HTTP,
new InetSocketAddress(proxyHost, proxyPort)))
.proxyAuthenticator(proxyAuthenticator).build();
}
}
Les points à noter sont indiqués ci-dessous.
feign.okhttp.OkHttpClient, utilisez un constructeur qui prend ʻokhttp3.OkHttpClient` comme argument., configurez-la pour qu'elle corresponde à proxy`.est correct,java.net.Authenticator` est incorrectest correct,feign.Client.OkHttpClient` est incorrect (crée une instance okhttp activée par proxy)(référence) https://stackoverflow.com/questions/35554380/okhttpclient-proxy-authentication-how-to