2012-02-01 12 views
5

qualcuno può spiegare il seguente:HTTP Cancellare con Richiesta corpo emette

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(); 
     } 
    } 
} 

L'esempio precedente genera la seguente eccezione:

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) 

Comunque se posso aggiungere una chiamata a setDoOutput (vero) , viene generata la seguente eccezione:

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) 

Quindi, se cambio e il protocollo da http a https non viene generata alcuna eccezione e viene restituito il codice di risposta previsto e il contenuto dal server. Ho esaminato il codice sorgente e sono in grado di seguire le chiamate e tracciare dove si verificano le eccezioni, ma perché sarebbe corretto effettuare tale richiesta tramite HTTPS ma non HTTP?

risposta

6

Questa è una limitazione (lo considero un bug o almeno una caratteristica stupida) di HttpURLConnection. Hai almeno not the only one che lo incontra quando gestisci i servizi web REST utilizzando URLConnection.

Utilizzare invece Apache HttpComponents Client.

Problemi correlati