Obtendo java.io.IOException: Erro ao gravar no servidor em getInputStream

Se a cadeia temp for muito grande, recebo java.io.IOException: Erro ao gravar no servidor em 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(); 

Por que é que? Essa chamada vai para o servlet mencionado na URL.

Eu acho que você pode ter um “muito longo url”, o número máximo de caracteres são 2000 ( veja este post para mais informações ). As solicitações GET não são feitas para manipular a input de dados tão longa.

Você pode, se também puder alterar o código do servlet, alterá-lo para uma solicitação POST em vez de GET (como você fez hoje). O código do cliente seria bem semelhante:

 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 ... } 

Eu não vi isso primeiro, mas parece que você tem um caractere de aspas simples na sua string de solicitação.

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

tente removê-lo, pode ajudá-lo!

Use o método HTTP POST em vez de colocar todos os dados no URL para o método GET. Há um limite superior para o tamanho do URL, portanto, você precisa usar o método POST se desejar enviar dados de tamanho arbitrário.

Você pode querer modificar o URL para http://localhost:8080/Myproject/TestServletUpdated e colocar o restante

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

no corpo da solicitação POST.

getInputStream () é usado para ler dados. Use getOutputStream ()

Pode ser porque o pedido está sendo enviado como um GET que tem uma limitação de poucos caracteres. Quando o limite exceder, você recebe uma IOException . Converta isso para POST e deve funcionar.

Para o POST

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

Remova a string temporária da URL que você está passando. Mova a string “command” para a "yourString".toBytes() no código acima