获取java.io.IOException:在getInputStream中写入服务器时出错

时间:2012-06-05 11:34:26

标签: java json url servlets

如果临时字符串非常大,我会得到java.io.IOException:在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 个答案:

答案 0 :(得分:3)

使用HTTP POST方法,而不是将所有数据都放在GET方法的URL中。 URL的长度有一个上限,因此如果要发送任意长度的数据,则需要使用POST方法。

您可能希望将网址修改为http://localhost:8080/Myproject/TestServletUpdated,然后将其余内容修改为

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

在POST请求的正文中。

答案 1 :(得分:2)

我认为你可能有一个“太长的网址”,最大字符数为2000(see this SO post for more info)。 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.....
                            ^

尝试删除它,它可能会帮助你!

答案 2 :(得分:0)

可能是因为请求是以GET发送的,其中包含极少数字符的限制。当限额超过时,您获得IOException。将其转换为POST,它应该有效。

POST

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

从您传递的网址中删除临时字符串。将“命令”字符串移动到上面代码中的"yourString".toBytes()部分

答案 3 :(得分:0)

getInputStream()用于读取数据。使用 getOutputStream()