【问题标题】:Problem with POSTing XML data to an API using Java使用 Java 将 XML 数据发布到 API 的问题
【发布时间】:2010-06-29 23:46:32
【问题描述】:

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

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

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

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

我对错误可能是什么没有太多想法,但连接有效,因为错误消息以 XML 格式返回。我只是将 XML 数据作为字符串发送。最后我是否可能需要发送 EOFsomething?我如何在我的 Java 代码中做到这一点?关于问题的任何其他想法?

API 是在 .NET 中制作的

这是我用来发布 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();
        ....

【问题讨论】:

    标签: java xml http-post eof outputstream


    【解决方案1】:

    它看起来不错,应该可以正常工作。但是,当您已经使用 connection.setDoOutput(true); 时,connection.setRequestMethod("POST"); 完全是多余的。

    由于此错误直接来自托管在 localhost 的 .NET Web 服务,您确定它编写时没有错误吗?我不使用 .NET,但 Google 告诉我它与 MemoryStream 有关。我会专注于 .NET 代码并重新测试/调试它。也许那些related SO questions 可能会有所帮助。

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 谢谢,但没有帮助:(
      【解决方案4】:

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

      【讨论】:

      • 啊,这只是我的一个错字,对不起。我现在更新了我的问题。我收到相同的错误消息。
      【解决方案5】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-12-19
        • 2020-10-02
        • 2021-07-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多