2012-02-01 93 views
5

誰能解釋如下:HTTP與請求體刪除發出

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

上面的例子拋出以下異常:

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) 

但是,如果我添加了一個調用setDoOutput(真) ,拋出以下例外:

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) 

那麼,如果我改變e從httphttps的協議不會引發任何異常,並且從服務器獲取預期的響應代碼和內容。我查看了源代碼並可以跟蹤調用並跟蹤發生異常的位置,但爲什麼可以通過HTTPS而不是HTTP來發出此類請求?

回答

6

這是一個限制(我認爲它是一個錯誤或至少是一個愚蠢的功能)HttpURLConnection。在使用URLConnection處理REST Web服務時遇到此問題的人至少是not the only one

請考慮使用Apache HttpComponents Client代替。