4

サーブレットからサーブレットを呼び出したいと思います。スタンドアロン アプリケーションからリモート サーブレットを呼び出すことはできますが、自分のサーブレット (Glassfish 上にあります) から呼び出すことはできません。呼び出しにはまったく同じコードを使用します (最後のコード行でエラーが発生します)。

URL serverAddress = new URL(endpoint);
//Set up the initial connection
HttpURLConnection connection = (HttpURLConnection) serverAddress.openConnection();
connection.setRequestMethod("POST");
connection.setDoOutput(true);
connection.setDoInput(true);
connection.setReadTimeout(timeOut);
connection.setRequestProperty("Content-Type", "text/xml; charset=ISO-8859-1");
connection.connect();
OutputStreamWriter wr = new OutputStreamWriter(connection.getOutputStream());
wr.write(requestBody);
wr.flush();
BufferedReader rd = new BufferedReader(new InputStreamReader(connection.getInputStream()));

このコードがリモート サーブレットの応答を読み取ることができないため、おそらくサーブレットはまったく応答しない可能性があります。しかし、スタンドアロン アプリから呼び出したときに応答するのはなぜですか? 私は本当に理解していません...私はこの例外を得ました:

java.net.SocketException: Unexpected end of file from server
    at sun.net.www.http.HttpClient.parseHTTPHeader(HttpClient.java:769)
    at sun.net.www.http.HttpClient.parseHTTP(HttpClient.java:632)
    at sun.net.www.http.HttpClient.parseHTTPHeader(HttpClient.java:766)
    at sun.net.www.http.HttpClient.parseHTTP(HttpClient.java:632)
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1049)

誰にもアイデアはありますか?サーブレットが HttpURLConnection を使用しないという制限がある可能性はありますか? ありがとう!

4

3 に答える 3

4

これは、Content-Lengthヘッダーが設定されていないために発生している可能性があります。また、End of POST リクエストボディが送信されないためです。サーバーは、ストリームの終了をタイムアウトするまで待機しています。

動作させるには、次の 2 つのことを試してください。

  • 実行する前に、コンテンツの長さヘッダーにリクエスト本文のサイズを設定しますconnect()
  • connection.getOutputStream().close()POST リクエストの最後を送信する を閉じてみてください。
于 2012-07-03T11:34:40.957 に答える
2

ヒットしているURLを見てください。私は同じ問題を抱えていましたが、多くの回帰の後、URLが生成され、ヒットするよりも空白があり、それが問題の原因であることがわかりました。それを呼び出すことでURLにエンコードspaceするunderscore
こともできますURIEncoder.encode(uri);の後の uri の部分のみを?エンコードする必要があります。

于 2012-12-12T09:12:44.077 に答える