Как настроить Spring Framework WebClient с реактором .tyty ProxyProvider для прокси-аутентификации? - PullRequest
0 голосов
/ 08 июля 2019

Я пытаюсь подключить свое приложение к общей службе отдыха. В моем случае для доступа в интернет вы должны подключиться через прокси. Я написал простой Java-клиент Rest с использованием WebClient Spring Framework. Чтобы добавить прокси-сервер, я сначала создаю HTTP-клиент и в конфигурации задаю параметры прокси-сервера, а затем устанавливаю соединитель на веб-клиент.

Я использую jdk1.8.0_181 и пружинную загрузку 2.1.2. Но для проведения тестов я написал главное.

Для соединения с прокси я попытался следующими способами:

  1. В качестве первой попытки я добавил заголовок defaultHeader для создания WebClient:
builder.defaultHeader(HttpHeaders.PROXY_AUTHORIZATION, "Basic "+Base64.encodeBase64("my_user:my_password".getBytes()) )
  1. В качестве второй попытки я попытался использовать 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 прокси требуется аутентификация

Пока ожидаемый вывод печатает результат.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...