2008-09-02 119 views

回答

16

如果使用openConnection()檢索URLConnection對象,它實際上並未開始與服務器通信。直到你從URLConnection()得到流,這纔會發生。當您第一次獲得連接時,您可以在實際打開連接之前添加/更改標題和其他連接屬性。

URLConnection的生命週期有點奇怪。它不會將頭部發送到服務器,直到您獲得其中一個流。如果你只是得到輸入流,那麼我相信它會做GET,發送頭文件,然後讓你讀取輸出。如果你得到了輸出流,那麼我相信它將它作爲POST發送,因爲它假定你將向它寫入數據(你可能需要調用setDoOutput(true)使輸出流工作)。一旦你得到輸入流,輸出流就關閉,並等待服務器的響應。

例如,這應該做一個POST:

URL myURL = new URL("http://example.com/my/path"); 
URLConnection conn = myURL.openConnection(); 
conn.setDoOutput(true); 
conn.setDoInput(true); 

OutputStream os = conn.getOutputStream(); 
os.write("Hi there!"); 
os.close(); 

InputStream is = conn.getInputStream(); 
// read stuff here 

雖然這會做一個GET:

URL myURL = new URL("http://example.com/my/path"); 
URLConnection conn = myURL.openConnection(); 
conn.setDoOutput(false); 
conn.setDoInput(true); 

InputStream is = conn.getInputStream(); 
// read stuff here 

URLConnection還會做其他奇怪的事情。如果服務器指定了內容長度,那麼URLConnection將保持底層輸入流處於打開狀態,直到它收到那麼多的數據,即使您明確關閉它。這給我們帶來了很多問題,因爲它會讓我們的客戶端變得更加困難,因爲URLConnection會使網絡連接保持打開狀態。這可能可能存在,即使你只是使用getStream()

3

不,它不。但是如果URL的協議是HTTP,那麼您將得到一個HttpURLConnection作爲返回對象。該類使用setRequestMethod方法來指定要使用的HTTP方法。

如果你想做更復雜的東西,你可能最好使用像Jakarta HttpClient這樣的庫。