Проблема с размещением XML-данных в API с использованием Java - PullRequest
2 голосов
/ 30 июня 2010

У меня проблема с отправкой XML-данных через HTTP POST в API.

Если я отправляю хорошо отформатированный XML, я получаю сообщение об ошибке:

Исключение сервера: невозможно получить доступ к закрытому потоку

Если XML не существуетт хорошо отформатирован, я получаю HTTP 500.И если я просто посылаю пустую строку вместо строки с XML, я получаю сообщение об ошибке: EMPTY REQUEST.

У меня не так много идей о том, что может быть ошибка, но соединение работаетпотому что сообщение об ошибке возвращается в формате XML.Я просто отправляю данные XML в виде строки.Возможно ли, что я должен отправить EOF или что-то в конце?И как мне это сделать в моем коде Java?Любые другие идеи о том, в чем может быть проблема?

API сделан в .NET

Вот код Java, который я использую для размещения данных XML:

  Authenticator.setDefault(new MyAuthenticator());
  String xmlRequestStatus = 
  "<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?><test><data>32</data></test>";
  System.out.println(xmlRequestStatus);
  String contentType = "text/xml";
  String charset = "ISO-8859-1";
  String request = null;
  URL url = null;
  HttpURLConnection connection = null;
  OutputStream output = null;
  InputStream response = null;
  try {
   url = new URL("http://127.0.0.1/test");
  } catch (MalformedURLException e) {
   e.printStackTrace();
  }

  try {
   connection = (HttpURLConnection)url.openConnection();
   connection.setDoOutput(true);
   connection.setRequestMethod("POST");
   connection.setRequestProperty("Accept-Charset", charset);
   connection.setRequestProperty("Content-Type", contentType);
   output = connection.getOutputStream();
   output.write(request.getBytes("ISO-8859-1"));
   if(output != null) try { output.close(); } catch (IOException e) {}

   response = connection.getInputStream();
        ....

Ответы [ 5 ]

1 голос
/ 08 июля 2010

выглядит нормально и должно работать нормально.Однако connection.setRequestMethod("POST"); совершенно лишнее, если вы уже сделали connection.setDoOutput(true);.

Поскольку эта ошибка исходит непосредственно от веб-службы .NET, размещенной на localhost, вы уверены, что она написана без ошибок?Я не работаю с .NET, но Google узнает, что это связано с MemoryStream.Я бы сконцентрировался на .NET-коде и повторно протестировал бы / отладил его.Может быть, эти связанные SO вопросы могут помочь.

0 голосов
/ 05 июля 2010

Похоже, что запрос инициализируется нулем, но впоследствии не устанавливается.Разве это не должно быть

output.write(xmlRequestStatus.getBytes("ISO-8859-1"));
0 голосов
/ 30 июня 2010

Возможно, закроем OutputStream позже в потоке управления. Так что вместо этого:

output.write(request.getBytes("ISO-8859-1"));
if(output != null) try { output.close(); } catch (IOException e) {}

response = connection.getInputStream();

Попробовать это (и, возможно, добавить флеш)?

output.write(request.getBytes("ISO-8859-1"));
output.flush();
response = connection.getInputStream();

if(output != null) try { output.close(); } catch (IOException e) {}
0 голосов
/ 30 июня 2010

Разве это не должно быть &lt;32 вместо <32?

0 голосов
/ 30 июня 2010

Вам нужно указать метод POST, выполнив что-то вроде этого,

 connection.setRequestMethod("POST");
 connection.setRequestProperty("Content-Length", "" + length);

В противном случае он обрабатывается как GET, и некоторый сервер не ожидает тело с GET, поэтому поток закрывается.

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