9

POSTを介してXMLファイル(xml形式の文字列)を別のサーブレットに送信するサーブレットを作成しようとしています。(必須ではないxml生成コードは「Hellothere」に置き換えられました)

   StringBuilder sb=  new StringBuilder();
    sb.append("Hello there");

    URL url = new URL("theservlet's URL");
    HttpURLConnection connection = (HttpURLConnection)url.openConnection();                
    connection.setRequestMethod("POST");
    connection.setRequestProperty("Content-Length", "" + sb.length());

    OutputStreamWriter outputWriter = new OutputStreamWriter(connection.getOutputStream());
    outputWriter.write(sb.toString());
    outputWriter.flush();
    outputWriter.close();

これによりサーバーエラーが発生し、2番目のサーブレットが呼び出されることはありません。

4

4 に答える 4

13

この種のことは、 HttpClientのようなライブラリを使用するとはるかに簡単です。ポストXMLコードの例もあります:

PostMethod post = new PostMethod(url);
RequestEntity entity = new FileRequestEntity(inputFile, "text/xml; charset=ISO-8859-1");
post.setRequestEntity(entity);
HttpClient httpclient = new HttpClient();
int result = httpclient.executeMethod(post);
于 2008-09-18T20:13:48.480 に答える
8

より優れた API であるため、代わりにApache HTTPClientを使用することをお勧めします。

しかし、この現在の問題を解決するconnection.setDoOutput(true);には、接続を開いた後に呼び出してみてください。

StringBuilder sb=  new StringBuilder();
sb.append("Hello there");

URL url = new URL("theservlet's URL");
HttpURLConnection connection = (HttpURLConnection)url.openConnection();                
connection.setDoOutput(true);
connection.setRequestMethod("POST");
connection.setRequestProperty("Content-Length", "" + sb.length());

OutputStreamWriter outputWriter = new OutputStreamWriter(connection.getOutputStream());
outputWriter.write(sb.toString());
outputWriter.flush();
outputWriter.close();
于 2008-09-18T20:12:41.133 に答える
2

使用することを忘れないでください:

connection.setDoOutput( true)

出力を送信する場合。

于 2008-09-18T20:10:35.383 に答える
2

HTTP ポスト アップロード ストリームのコンテンツとそのメカニズムが、期待しているものとは異なっているようです。POST には、POST リクエストに含まれるデータの送信方法に関する非常に具体的な RFC 標準があるため、投稿コンテンツとしてファイルを書き込むことはできません。コンテンツ自体のフォーマットだけでなく、出力ストリームへの「書き込み」方法のメカニズムでもあります。多くの場合、POST はチャンクで書き込まれます。Apache の HTTPClient のソース コードを見ると、チャンクがどのように書き込まれるかがわかります。

結果として、コンテンツの長さには癖があります。コンテンツの長さは、チャンクを識別する小さな数字と、ストリームに書き込まれるときに各チャンクを区切るランダムな小さな文字列によって増加するためです。HTTPURLConnection の新しい Java バージョンで説明されている他のメソッドのいくつかを見てください。

http://java.sun.com/javase/6/docs/api/java/net/HttpURLConnection.html#setChunkedStreamingMode(int)

自分が何をしているのかわからず、それを学びたくない場合、Apache HTTPClient のような依存関係を追加することは、すべての複雑さを抽象化して機能するため、実際にははるかに簡単になります。

于 2008-09-19T21:18:33.253 に答える