OKHTTP newCall () зависает при вызове restAPI - PullRequest
0 голосов
/ 09 ноября 2018

Попытка публикации в restAPI с использованием JAVA OKHttp.

Мой код выглядит следующим образом:

try {
            loggingInterceptor = new HttpLoggingInterceptor();
            loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
            client = new OkHttpClient.Builder()
                .connectTimeout(10, TimeUnit.SECONDS)
                .addInterceptor(loggingInterceptor)
                .build();
            MediaType mediaType = MediaType.parse("app.lication/json");
            RequestBody body = RequestBody.create(mediaType, FileUtils.readFileToString(file));    
            Request request = new Request.Builder()
                    .url(restAPIUrl)
                    .post(body)
                    .addHeader("content-type", "application/json")
                    .addHeader("cache-control", "no-cache")
                    .build();

            Call call = client.newCall(request);
            call.execute();

            handleResponse(file, response.code());

        } catch (Exception e) {

            logger.severe("Http Request failed: " + e.getMessage());

        }

В моем локальном окне разработки (centos), в котором нет брандмауэра, открытого для restAPI, все работает так, как ожидалось. call.execute () выдает исключение: не удалось разрешить хост: имя или служба недоступны.

На производственной коробке (rhel), где открыт брандмауэр. Вызов метода client.newCall (запрос); просто висит бесконечно. (Перед вызовом execute ()) strace просто показывает ожидающий поток.

Я подтвердил, что могу получить restAPI из командной строки с помощью:

curl -X get https://restAPIUrl/index.html

Один и тот же jar ведет себя по-разному на двух серверах. Я не могу понять, почему различия в конфигурации сервера могут повлиять на newCall () (я бы больше ожидал его при выполнении) Что может быть причиной зависания newCall () из-за окружающей среды? Любая помощь будет высоко ценится.

спасибо!


Обновление:

Я обнаружил, что он проходит метод newCall (), если переопределяю defaultSocketFactory.

client = new OkHttpClient.Builder()
                .connectTimeout(10, TimeUnit.SECONDS)
                .addInterceptor(loggingInterceptor)
                .setSocketFactory(new SocketFactory () {
                       @Override
                        public Socket createSocket(String s int i) thorws IOException, UnknownHostException {
                              return null;
                         }
                         .
                         .
                 })
                .build();

Почему бы системе не правильно распределить сокет для клиента, используя defaultSocketFactory в rhel env? (SELINUX отключен.)


Обновление 2: разрешение

В конце концов, эта проблема была вызвана отсутствием разрешений на чтение для local_policy.jar в $ JAVA_HOME / lib / security. (Файл не существует в моей среде разработки)

Неприятной частью было то, что исключение прав доступа было поглощено API OKHttp.

1 Ответ

0 голосов
/ 15 апреля 2019

Попробуйте исправить провайдера безопасности, как описано в «Обновите провайдера безопасности для защиты от эксплойтов SSL» .

Просто внедрите ProviderInstaller.installIfNeeded (или installIfNeededAsync)

...