如果临时字符串非常大,我会得到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。
答案 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()