Попытка публикации в 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.