Excluir HTTP com problemas do corpo da solicitação

Alguém pode explicar o seguinte:

package com.foo.bar; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.ProtocolException; import java.net.URL; import org.springframework.util.FileCopyUtils; public class ATest { public static void main(String[] args) throws Exception { try { final String payload = "{\"parentExecutor\":\"foo1233\"}"; URL url = new URL("http://localhost/notes"); final HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setRequestMethod("DELETE"); connection.setRequestProperty("Accept", "application/json"); connection.setRequestProperty("Content-Type", "application/json"); FileCopyUtils.copy(payload.getBytes(), connection.getOutputStream()); connection.connect(); final InputStream is = connection.getInputStream(); int b = is.read(); String result = ""; while (b != -1) { result += (char) b; b = is.read(); } System.out.println(connection.getResponseCode()); System.out.println(result); is.close(); } catch (final ProtocolException e) { e.printStackTrace(); } } } 

O exemplo acima lança a seguinte exceção:

 java.net.ProtocolException: cannot write to a URLConnection if doOutput=false - call setDoOutput(true) at sun.net.www.protocol.http.HttpURLConnection.getOutputStream(HttpURLConnection.java:995) at com.foo.bar.ATest.main(ATest.java:24) 

No entanto, se eu adicionar uma chamada para setDoOutput (true) , a seguinte exceção será lançada:

 java.net.ProtocolException: HTTP method DELETE doesn't support output at sun.net.www.protocol.http.HttpURLConnection.getOutputStream(HttpURLConnection.java:1004) at com.foo.bar.ATest.main(ATest.java:25) 

Então, se eu mudar o protocolo de http para https, nenhuma exceção será lançada e eu recebo de volta o código de resposta esperado e o conteúdo do servidor. Eu olhei para o código-fonte e posso seguir as chamadas e rastrear onde as exceções estão acontecendo, mas por que seria OK fazer tal solicitação via HTTPS, mas não HTTP?

Esta é uma limitação (eu consideraria ser um bug ou, pelo menos, um recurso estúpido) de HttpURLConnection . Você não é, pelo menos, o único que encontra isso quando lida com serviços web REST usando URLConnection .

Considere o uso do Apache HttpComponents Client .