2

HTTPPOSTを使用してXMLデータをAPIに送信する際に問題が発生しました。

適切にフォーマットされたXMLを送信すると、次のエラーメッセージが表示されます。

サーバー例外:閉じたストリームにアクセスできません

XMLが適切にフォーマットされていない場合は、を取得しHTTP 500ます。また、XMLを含む文字列の代わりに空の文字列を送信すると、次のエラーメッセージが返されますEMPTY REQUEST

エラーが何であるかについてはあまりわかりませんが、エラーメッセージがXML形式で返されるため、接続は機能します。XMLデータを文字列として送信しているだけです。最終的にEOFなどを送信する必要がある可能性はあります?そして、Javaコードでそれをどのように行うのですか?問題が何であるかについての他のアイデアはありますか?

APIは.NETで作成されています

XMLデータをPOSTするために使用している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();
        ....
4

5 に答える 5

1

見た目は問題なく、正常に機能するはずです。ただし、connection.setRequestMethod("POST");すでに行った場合は完全に不要ですconnection.setDoOutput(true);

このエラーはローカルホストでホストされている.NETWebサービスから直接発生しているので、バグなしで記述されていると確信していますか?私は.NETをしていませんが、Googleはそれがに関連していることを私に知らせますMemoryStream。.NETコードに集中して、再テスト/デバッグします。たぶん、それらの関連するSOの質問が役立つかもしれません。

于 2010-07-08T11:38:51.397 に答える
0

&lt;32代わりにすべきではありません<32か?

于 2010-06-30T03:20:15.363 に答える
0

次のようにして、メソッドPOSTを指定する必要があります。

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

それ以外の場合は、GETとして扱われ、一部のサーバーはGETで本体を予期しないため、ストリームは閉じられます。

于 2010-06-29T23:50:57.300 に答える
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) {}
于 2010-06-30T00:00:39.930 に答える
0

リクエストはnullに初期化されているようですが、その後は設定されていません。すべきではない

output.write(xmlRequestStatus.getBytes("ISO-8859-1"));
于 2010-07-05T10:46:46.960 に答える