Вызов Webservice возвращает ошибку 500 - PullRequest
8 голосов
/ 01 марта 2011

Я запустил небольшой проект на Java.
Мне нужно создать клиент, который будет отправлять xml на URL в виде HTTP-запроса POST.
Я пробую его с помощью пакета java.net.* (Ниже приведен фрагменткода), но я получаю сообщение об ошибке:

java.io.IOException: Server returned HTTP response code: 500 for URL: "target url"
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1441)
    at newExample.main(newExample.java:36)

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

try {
        URL url = new URL("target url");

        URLConnection connection = url.openConnection();

        if( connection instanceof HttpURLConnection )
            ((HttpURLConnection)connection).setRequestMethod("POST");

        connection.setRequestProperty("Content-Length", Integer.toString(requestXml.length()) );
        connection.setRequestProperty("Content-Type","text/xml; charset:ISO-8859-1;");
        connection.setDoOutput(true);
        connection.connect();           

        // Create a writer to the url
        PrintWriter writer = new PrintWriter(new
        OutputStreamWriter(connection.getOutputStream()));

        // Get a reader from the url
        BufferedReader reader = new BufferedReader(new
        InputStreamReader(connection.getInputStream()));

        writer.println();
        writer.println(requestXml);
        writer.println();
        writer.flush();

        String line = reader.readLine();
            while( line != null ) {
                    System.out.println( line );
                    line = reader.readLine();
            }


    } catch (MalformedURLException e) {
                    e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

Пожалуйста, помогите с подходящими примерами или любыми другими способами сделать это.

Укажите ошибки / ошибки в приведенном выше коде или других возможностях.

Мой веб-сервис находится в весенней среде

xml для отправки в формате строки: requestXml

Ответы [ 5 ]

21 голосов
/ 22 октября 2012

Проблема заключается в следующем коде

// Get a reader from the url
BufferedReader reader = new BufferedReader(new
InputStreamReader(connection.getInputStream()));

Поскольку служба не всегда может вернуть вам правильный ответ ... так как вы вызываете службу через http, возможно, что сам сервернедоступен или услуга недоступна.Поэтому вы всегда должны проверять код ответа перед чтением ответа из потоков, основываясь на коде ответа, который вы решаете, читать ли его из inputStream для успешного ответа или из errorStream для ошибки или условия исключения.1006 * Это решит проблему

3 голосов
/ 01 марта 2011

Проблема в коде вашего сервера или конфигурации сервера:

10.5.1 500 Внутренняя ошибка сервера

На сервере возникло непредвиденное состояние, котороепомешал ему выполнить запрос.

( w3c.org / Protocols )

Если сервер находится под вашим контролем (должно быть, если я посмотрю на URL [передправка] ), затем взгляните на логи сервера.

1 голос
/ 01 марта 2011

Я думаю, что ваша проблема в том, что вы открываете входной поток до того, как записали и закрыли выходной поток. Конечно, Sun Tutorial делает это таким образом.

Если вы откроете входной поток слишком рано, возможно, что выходной поток будет автоматически закрыт, в результате чего сервер увидит пустой запрос POST. Этого может быть достаточно, чтобы он запутался и отправил 500 ответов.

Даже если это не то, что вызывает 500 ошибок, было бы неплохо сделать все в порядке, указанном в руководстве. Для начала, если вы случайно прочитали ответ до того, как закончили писать запрос, вы, вероятно, (хотя бы временно) заблокируете соединение. (На самом деле, похоже, что ваш код делает это, потому что вы не закрываете устройство записи перед чтением из устройства чтения.)

Отдельная проблема заключается в том, что ваш код не закрывает соединение при любых обстоятельствах и поэтому может привести к утечке сетевых соединений. Если это будет повторяться, это может привести к большему количеству исключений IOException.

1 голос
/ 01 марта 2011

Ну, вы должны закрыть свои потоки и соединения.Может помочь автоматическое управление ресурсами из Java 7 или http://projectlombok.org/.Тем не менее, это, вероятно, не главная проблема.

Основная проблема заключается в сбое на стороне сервера.HTTP-код 500 означает ошибку на стороне сервера.Я не могу сказать вам причину, потому что я не знаю серверную часть.Может быть, вы должны посмотреть журнал сервера.

0 голосов
/ 29 сентября 2017

Если вы вызываете Внешний веб-сервис и передаете JSON в вызове REST, проверьте тип данных переданных значений.

Пример:

{ "originalReference":"8535064088443985",
  "modificationAmount":
    { "amount":"16.0",
      "currency":"AUD"
    },
  "reference":"20170928113425183949",
  "merchantAccount":"MOM1"
}

В этом примере значение суммы было отправлено в виде строки, и произошел сбой вызова веб-службы, когда сервер вернул код ответа HTTP: 500. Но когда сумма: 16.0 была отправлена, то есть было передано целое число, звонок прошел. Хотя вы обращались к документации API при вызове таких внешних API, такие мелкие детали, как эта, могут быть упущены.

...