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 中提到的 servlet。

4

4 回答 4

3

使用 HTTP POST 方法而不是将所有数据放在 GET 方法的 URL 中。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

我认为您可能有一个“网址太长”,最大字符数为 2000(有关更多信息,请参阅此 SO 帖子)。不会发出 GET 请求来处理如此长的数据输入。

如果您也可以更改 servlet 代码,则可以将其更改为 POST 而不是 GET 请求(就像您今天一样)。客户端代码看起来很相似:

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 回答