HTTP-запрос не отвечает в производственной среде (война с сервером tomcat) - PullRequest
0 голосов
/ 07 мая 2018

Я реализовал функцию PerformHttpPostRequest, которая должна отправлять запрос на публикацию, содержит тело типа JSON и получать ответ JSON через Apache HttpClient.

public static String PerformHttpPostRequest(String url, String requestBody) throws IOException {

CloseableHttpClient client = HttpClients.createDefault();
HttpPost httpPost = new HttpPost(url);

StringEntity entity = new StringEntity(requestBody);

httpPost.setEntity(entity);
httpPost.setHeader("Accept", "application/json");
httpPost.setHeader("Content-type", "application/json");

CloseableHttpResponse response = client.execute(httpPost);

HttpEntity httpEntity = response.getEntity();
InputStream is = httpEntity.getContent();

return (new BufferedReader(new InputStreamReader(is, "UTF-8"))).readLine();
}

Проблема в том, что код отлично работает в среде разработки, но при запуске файла war с сервером tomcat, но запрос не выполняется.

Я попытался добавить несколько блоков перехвата, таких как IOException, Exception, и код не дошел.

Я добавил отладочные отпечатки, которые продемонстрировали, что код перестает отвечать на команду client.execute(...).

Функция вызывается внутри блока try, и после выполнения команды .execute(...) код попадает в блок finally.

Я уже искал похожую проблему и не нашел ответа.

Это известная проблема? Кто-нибудь имеет представление о том, что может вызвать это? Или как я могу это исправить?

Ответы [ 4 ]

0 голосов
/ 08 мая 2018

Если код не выходит за пределы client.execute(...), но он выполняет блок finally в вызывающем коде, то вы можете узнать, что вызвало прерванное выполнение, добавив этот блок catch в блок try, который содержит finally:

catch(Throwable x) {
    x.printStackTrace();
}

Throwable является суперклассом для всех классов исключений и ошибок, поэтому перехват Throwable отлавливает все.

0 голосов
/ 07 мая 2018

Я пробовал с RestTemplate.

RequestObject requestObject = new RequestObject();
        requestObject.setKey("abcd");
        requestObject.setEndpoint(serviceEndPoint);

        RestTemplate restTemplate = new RestTemplate();
        HttpEntity<RequestObject> requestBody = new HttpEntity<RequestObject>(
                requestObject);

        ResponseEntity<RequestObject> result = restTemplate.postForEntity(
                serviceEndPoint, requestBody, RequestObject.class);

Это очень просто и без проблем, надеюсь, это поможет

0 голосов
/ 07 мая 2018

Мало что можно попробовать. - Попробуйте сделать ping / curl из той коробки, где вы запускаете tomcat. - Попробуйте использовать метод тестирования, который делает запрос get на сервер, который всегда доступен. Для бывшего google.com и распечатать статус. Таким образом, вы сможете узнать, что ваш код на самом деле работает или нет в env сервера. Надеюсь это поможет. :)

0 голосов
/ 07 мая 2018

Привет Талор, приятно познакомиться, Пожалуйста, попробуйте использовать HttpURLConnection для решения этой проблемы следующим образом:

Java - легкая отправка параметров HTTP методом POST

Хорошего дня.

el profesor

...