Ich denke, dass einige Unternehmen beim Herstellen einer Verbindung zum Internet einen "Proxy" durchlaufen müssen, für den eine Authentifizierung erforderlich ist. Ich möchte erklären, wie man "Proxy" setzt, wenn man eine im Internet veröffentlichte API mit dem API-Client "Feign" in einer solchen Umgebung aufruft.
Feign
delegiert den Prozess der Ausgabe einer HTTP-Anfrage an eine andere Bibliothek.
Mit anderen Worten, es reicht aus, den "Proxy" der zu verwendenden Bibliothek zu unterstützen.
Ändern Sie dieses Mal "Feign" (Beispiel, um Mitwirkende des angegebenen GitHub-Repositorys zu erhalten, das auf der GitHub-Seite erläutert wird) (https://github.com/OpenFeign/feign#basics), um "Proxy" zu unterstützen. schauen.
Die Erklärung von "Feign" finden Sie unter "Feign, das den API-Client nur mit Schnittstelle implementiert, ist sehr praktisch!".
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();
}
}
Die zu beachtenden Punkte sind unten aufgeführt.
feign.okhttp.OkHttpClient
einen Konstruktor, der okhttp3.OkHttpClient
als Argument verwendet.okhttp3.Authenticator
ist korrekt, java.net.Authenticator
ist falschokhttp3.OkHttpClient
ist korrekt, feign.Client.OkHttpClient
ist falsch (erstellt eine Proxy-fähige okhttp-Instanz)(Referenz) https://stackoverflow.com/questions/35554380/okhttpclient-proxy-authentication-how-to
Recommended Posts