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