2017-01-06 33 views
4

我正在使用java.net在我的Java客戶端中發送HTTP請求,但我仍然無法實現/查找如何實際觸發請求。java.net如何激發HTTP請求

例如,我有這樣的代碼:

Scanner sc = new Scanner(System.in); 

System.out.println("Deleting subject..."); 
System.out.println("Subject shortcut (-1 for return):"); 
String shortcut = sc.next(); 
if(shortcut.equals("-1")) 
    return ; 

try 
{ 
    URL url = new URL("http://localhost:8080/Server/webresources/subject/delete/"+shortcut); 
    HttpURLConnection con = (HttpURLConnection)url.openConnection(); 
    con.setDoOutput(true); 
    con.setRequestMethod("DELETE"); 

    BufferedReader br = new BufferedReader(new InputStreamReader(con.getInputStream())); 
    System.out.println(br.readLine()); 
}catch(Exception e) 
{ 
    System.out.println(e.getMessage()); 
} 

在此代碼,如果我不使用這些行:

BufferedReader br = new BufferedReader(new InputStreamReader(con.getInputStream())); 
System.out.println(br.readLine()); 

的要求永遠不會發送。所以在這種情況下,請求似乎是通過從連接調用InputStream來觸發的。

任何人都可以解釋我怎麼通過java.net發起HTTP請求?

+0

[使用java.net.URLConnection中的火災和處理HTTP請求]的可能的複製(http://stackoverflow.com/questions/2793150/using-java-net-urlconnection-to-fire-and -handle-http-requests) – Michael

+1

這個問題的第一個答案進入了相當多的細節。基本上你是正確的,當你從輸入流中讀取請求時發送。 – Michael

+1

@Michael URLConnection#connect()寫在您剛剛發佈的主題中不起作用。 – scarface

回答

5

從文檔中,如果您撥打connect(),或者撥打依賴於連接的操作(如getInputStream()),則HttpURLConnection將連接。

打開的通信鏈接到此URL引用的資源,如果 這樣的連接尚未建立。如果在連接已打開時調用連接 方法 (由具有值true的連接字段指示),則忽略該呼叫 。

URLConnection對象需要經歷兩個階段:首先創建它們,然後連接它們 。創建後,連接 之前,可以指定各種選項(例如,doInput和 UseCaches)。連接後,嘗試設置它們是錯誤的。 取決於連接的操作,如getContentLength,將 隱式執行連接,如有必要。

然而,幾個主題表明connect()不會犯的實際要求,但getInputStream()(最有可能的任何方法讀取服務器的響應如getResponseCode()),將:

Java URLConnection - When do I need to use the connect() method?

Why does HttpURLConnection not send the HTTP request

How to send PUT, DELETE HTTP request in HttpURLConnection?

+0

不幸的是,如果我調用'connect()',就會發生nohing。 – scarface

+0

@scarface:這很奇怪,但你必須是正確的,因爲以下主題的評論陳述了同樣的事情:http://stackoverflow.com/questions/1051004/how-to-send-put-delete-http-request -in-httpurlconnection – Berger

+0

我將檢查這些主題。無論如何,在某些情況下,我實際上沒有從服務器獲得任何輸出,所以獲得InputStream是很奇怪的。順便說一下,當我要求一個響應號碼時,請求被髮送。 – scarface

0

每次調用此URL的協議處理程序的URLStreamHandler.openConnection(URL)方法時,都會創建一個新的URLConnection實例。

應該指出的是,URLConnection實例在創建時不建立實際的網絡連接。只有在調用URLConnection.connect()時纔會發生這種情況。 see javadoc

String url = "http://example.com"; 

    URL obj = new URL(url); 
    HttpURLConnection con = (HttpURLConnection) obj.openConnection(); 

    con.setRequestMethod("GET"); 

    //add request header 
    con.setRequestProperty("User-Agent", USER_AGENT); 

    int responseCode = con.getResponseCode(); 
+0

這很酷,但它沒有回答我的問題。而不是獲得InputStream,我得到responseCode,這就是全部。這不是一個解釋。 – scarface