0

一時文字列が非常に大きい場合、 java.io.IOException: Error writing to server at getInputStream が発生します

String tmp  = js.deepSerialize(taskEx);
URL url = new URL("http://"
                    + "localhost"
                    + ":"
                    + "8080"
                    + "/Myproject/TestServletUpdated?command=startTask&taskeId=" +taskId + "'&jsonInput={\"result\":"
                    + URLEncoder.encode(tmp) + "}"); 

                    URLConnection conn = url.openConnection();
                     InputStream is = conn.getInputStream();

何故ですか?この呼び出しは、URL に記載されているサーブレットに送信されます。

4

4 に答える 4

3

GET メソッドの URL にすべてのデータを入れる代わりに、HTTP POST メソッドを使用します。URLの長さには上限があるため、任意の長さのデータを送信したい場合はPOSTメソッドを使用する必要があります。

URL を に変更しhttp://localhost:8080/Myproject/TestServletUpdated、残りを配置することもできます。

command = "startTask&taskeId=" + taskId + "'&jsonInput={\"result\":" + URLEncoder.encode(tmp) + "}"

POST リクエストの本文に。

于 2012-06-05T11:39:44.567 に答える
2

「URL が長すぎる」可能性があると思います。最大文字数は 2000 です (詳細については、この SO 投稿を参照してください)。このような長いデータ入力を処理するための GET 要求は行われません。

サーブレット コードも変更できる場合は、GET 要求の代わりに POST に変更できます (現在のように)。クライアント コードは非常に似ています。

public static void main(String[] args) throws IOException {

    URL url = new URL("http", "localhost:8080", "/Myproject/TestServletUpdated");

    URLConnection conn = url.openConnection();
    conn.setDoOutput(true);

    OutputStreamWriter wr = new OutputStreamWriter(conn.getOutputStream());
    wr.write("command=startTask" +
             "&taskeId=" +taskId +
             "&jsonInput={\"result\":" + URLEncoder.encode(tmp) + "}");
    wr.flush();


    .... handle the answer ...
}

最初は見ませんでしたが、リクエスト文字列に一重引用符が含まれているようです。

...sk&taskeId=" + taskId + "'&jso.....
                            ^

それを削除してみてください、それはあなたを助けるかもしれません!

于 2012-06-05T11:36:56.027 に答える
0

これは、リクエストがGET非常に少数の文字の制限があるとして送信されていることが原因である可能性があります。制限を超えると、が取得されますIOException。これをに変換するPOSTと、機能するはずです。

にとってPOST

URLConnection conn = url.openConnection().
OutputStream writer = conn.getOutputSteam();
writer.write("yourString".toBytes());

渡すURLから一時文字列を削除します。「コマンド」文字列を"yourString".toBytes()上記のコードのセクションに移動します

于 2012-06-05T11:44:11.077 に答える
0

getInputStream()は、データの読み取りに使用されます。getOutputStream()を使用する

于 2012-06-05T11:46:34.543 に答える