Я пытаюсь подключить свое приложение к общей службе отдыха. В моем случае для доступа в интернет вы должны подключиться через прокси. Я написал простой Java-клиент Rest с использованием WebClient Spring Framework
. Чтобы добавить прокси-сервер, я сначала создаю HTTP-клиент и в конфигурации задаю параметры прокси-сервера, а затем устанавливаю соединитель на веб-клиент.
Я использую jdk1.8.0_181
и пружинную загрузку 2.1.2. Но для проведения тестов я написал главное.
Для соединения с прокси я попытался следующими способами:
- В качестве первой попытки я добавил заголовок defaultHeader для создания WebClient:
builder.defaultHeader(HttpHeaders.PROXY_AUTHORIZATION, "Basic "+Base64.encodeBase64("my_user:my_password".getBytes()) )
- В качестве второй попытки я попытался использовать ProxyAuthenticator:
Authenticator.setDefault(new ProxyAuthenticator("my_user", "my_password"));
System.setProperty("http.proxyHost", "my_host");
System.setProperty("http.proxyPort", "my_port");
определив ProxyAuthenticator
отдельно:
import java.net.Authenticator;
import java.net.PasswordAuthentication;
class ProxyAuthenticator extends Authenticator {
private String user, password;
public ProxyAuthenticator(String user, String password) {
this.user = user;
this.password = password;
}
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(user, password.toCharArray());
}
}
без успеха.
Вот мой чистый код без всех ранее выполненных тестов:
public static WebClient getClient(String url, String httpHeaders, String mediaType, boolean isProxy) {
Function <String, String> pwd = username -> "my_password" ;
Builder builder = WebClient.builder();
if(isProxy) {
HttpClient httpClient = HttpClient.create()
.tcpConfiguration(tcpClient ->
tcpClient.proxy(proxy -> proxy.type(ProxyProvider.Proxy.HTTP)
.host(my_host)
.port(my_port)
.username(my_username)
.password(pwd)
.nonProxyHosts(my_exclusion)
).option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 1000));
ReactorClientHttpConnector connector = new ReactorClientHttpConnector(httpClient);
builder.clientConnector(connector);
}
return builder.defaultHeader(httpHeaders,mediaType).baseUrl(url).build();
}
public static Mono<?> getCall( WebClient client3, String uri, Class<?> bodyType) {
UriSpec<RequestBodySpec> request = client3.method(HttpMethod.GET);
RequestBodySpec requestBodyspec = request.uri(uri);
ResponseSpec response = requestBodyspec.retrieve();
return response.bodyToMono(bodyType);
}
public static void main(String[] args) {
WebClient client3 = getClient("https://jsonplaceholder.typicode.com", HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE, true);
Mono<?> result = getCall(client3, "/todos/1", JsonNode.class);
System.out.println(result.block().toString());
}
Ошибка, которую вызывает мой код, следующая:
Исключение в потоке "главный" реактор.core.Exceptions $ ReactiveException: io.netty.handler.proxy.ProxyConnectException: http, basic, proxy.host.it => jsonplaceholder.typicode.com:443, статус: 407 прокси требуется аутентификация
Пока ожидаемый вывод печатает результат.