使用Java将XML数据发布到API的问题

时间:2010-06-29 23:46:32

标签: java xml http-post eof outputstream

我在使用HTTP POST向API发送XML数据时遇到问题。

如果我发送格式良好的XML,我会收到一条错误消息:

  

服务器异常:无法访问已关闭的流

如果XML格式不正确,我会得到HTTP 500。如果我只发送一个空字符串而不是XML字符串,我会收到一条错误消息:EMPTY REQUEST

我对错误的内容没有太多想法,但连接有效,因为错误消息以XML格式返回。我只是将XML数据作为字符串发送。是否有可能我最终需要发送 EOF 某些内容?我如何在Java代码中执行此操作?关于问题可能是什么的任何其他想法?

API是用.NET制作的

以下是我用于POST XML数据的Java代码:

  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 个答案:

答案 0 :(得分:1)

看起来很好,应该可以正常工作。但是,当您connection.setRequestMethod("POST");已经完成connection.setDoOutput(true);时,MemoryStream完全是多余的。

由于此错误直接来自localhost托管的.NET Web服务,您确定它是在没有错误的情况下编写的吗?我不做.NET,但Google了解到它与{{1}}有关。我专注于.NET代码并重新测试/调试它。也许那些related SO questions可能有帮助。

答案 1 :(得分:0)

您需要通过执行类似的操作来指定方法POST,

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

否则,它被视为GET,而某些服务器不期望具有GET的主体,因此流被关闭。

答案 2 :(得分:0)

可能稍后在控制流中关闭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) {}

答案 3 :(得分:0)

不应该是&lt;32而不是<32吗?

答案 4 :(得分:0)

看起来请求被初始化为null,但之后没有设置。它应该不是

output.write(xmlRequestStatus.getBytes("ISO-8859-1"));