詳解HttpURLConnection

請求響應流程

請求響應流程

設置連接參數的方法

  • setAllowUserInteraction
  • setDoInput
  • setDoOutput
  • setIfModifiedSince
  • setUseCaches
  • setDefaultAllowUserInteraction
  • setDefaultUseCaches

設置請求頭或響應頭

HTTP請求允許一個key帶多個用逗號分開的values,但是HttpURLConnection只提供了單個操作的方法:

  • setRequestProperty(key,value)
  • addRequestProperty(key,value)

setRequestProperty和addRequestProperty的區別就是,setRequestProperty會覆蓋已經存在的key的所有values,有清零重新賦值的作用。而addRequestProperty則是在原來key的基礎上繼續添加其他value。

發送URL請求

建立實際連接之後,就是發送請求,把請求參數傳到服務器,這就需要使用outputStream把請求參數傳給服務器:

  • getOutputStream 

獲取響應

請求發送成功之後,即可獲取響應的狀態碼,如果成功既可以讀取響應中的數據,獲取這些數據的方法包括:

  • getContent
  • getHeaderField
  • getInputStream 

對於大部分請求來說,getInputStream和getContent是用的最多的。

相應的信息頭用以下方法獲取:

  • getContentEncoding
  • getContentLength
  • getContentType
  • getDate
  • getExpiration
  • getLastModifed 

HttpURLConnection

任何網絡連接都需要經過socket才能連接,HttpURLConnection不需要設置socket,所以,HttpURLConnection並不是底層的連接,而是在底層連接上的一個請求。這就是爲什麼HttpURLConneciton只是一個抽象類,自身不能被實例化的原因。HttpURLConnection只能通過URL.openConnection()方法創建具體的實例。

雖然底層的網絡連接可以被多個HttpURLConnection實例共享,但每一個HttpURLConnection實例只能發送一個請求。請求結束之後,應該調用HttpURLConnection實例的InputStream或OutputStream的close()方法以釋放請求的網絡資源,不過這種方式對於持久化連接沒用。對於持久化連接,得用disconnect()方法關閉底層連接的socket。

創建HttpURLConnection

[java] view plain copy
  1. URL url = new URL("http://localhost:8080/xxx.do");    
  2.      
  3. URLConnection rulConnection = url.openConnection();// 此處的urlConnection對象實際上是根據URL的    
  4. // 請求協議(此處是http)生成的URLConnection類    
  5. // 的子類HttpURLConnection,故此處最好將其轉化    
  6. // 爲HttpURLConnection類型的對象,以便用到    
  7. // HttpURLConnection更多的API.如下:    
  8.      
  9. HttpURLConnection httpUrlConnection = (HttpURLConnection) rulConnection;    

設置HttpURLConnection參數

[java] view plain copy
  1. // 設定請求的方法爲"POST",默認是GET    
  2. httpUrlConnection.setRequestMethod("POST");    
  3.     
  4. // 設置是否向httpUrlConnection輸出,因爲這個是post請求,參數要放在    
  5. // http正文內,因此需要設爲true, 默認情況下是false;    
  6. httpUrlConnection.setDoOutput(true);    
  7.      
  8. // 設置是否從httpUrlConnection讀入,默認情況下是true;    
  9. httpUrlConnection.setDoInput(true);    
  10.      
  11. // Post 請求不能使用緩存    
  12. httpUrlConnection.setUseCaches(false);    
  13.      
  14. // 設定傳送的內容類型是可序列化的java對象    
  15. // (如果不設此項,在傳送序列化對象時,當WEB服務默認的不是這種類型時可能拋java.io.EOFException)    
  16. httpUrlConnection.setRequestProperty("Content-type""application/x-java-serialized-object");    
  17.    
  18. // 連接,從上述url.openConnection()至此的配置必須要在connect之前完成,    
  19. httpUrlConnection.connect();    

URLConnection建立連接

[java] view plain copy
  1. // 此處getOutputStream會隱含的進行connect(即:如同調用上面的connect()方法,    
  2. // 所以在開發中不調用上述的connect()也可以)。    
  3. OutputStream outStrm = httpUrlConnection.getOutputStream();    
[java] view plain copy
  1. <p>getInputStream()也是同理。</p>  

HttpURLConnection發送請求

[java] view plain copy
  1. // 現在通過輸出流對象構建對象輸出流對象,以實現輸出可序列化的對象。    
  2. ObjectOutputStream objOutputStrm = new ObjectOutputStream(outStrm);    
  3.      
  4. // 向對象輸出流寫出數據,這些數據將存到內存緩衝區中    
  5. objOutputStrm.writeObject(new String("我是測試數據"));    
  6.      
  7. // 刷新對象輸出流,將任何字節都寫入潛在的流中(些處爲ObjectOutputStream)    
  8. objOutputStm.flush();    
  9.     
  10. // 關閉流對象。此時,不能再向對象輸出流寫入任何數據,先前寫入的數據存在於內存緩衝區中,    
  11. // 在調用下邊的getInputStream()函數時才把準備好的http請求正式發送到服務器    
  12. objOutputStm.close();    

HttpURLConneciton獲取響應

 // 調用HttpURLConnection連接對象的getInputStream()函數,  

InputStream inStrm = httpConn.getInputStream(); 

設置POST參數

[java] view plain copy
  1. OutputStream os = httpConn.getOutputStream();    
  2.              String param = new String();    
  3.              param = "CorpID=" + CorpID +    
  4.                      "&LoginName=" + LoginName+    
  5.                      "&send_no=" + phoneNumber +    
  6.                      "&msg=" + java.net.URLEncoder.encode(msg,"GBK"); ;    
  7.              os.write(param.getBytes());    

超時設置,防止 網絡異常的情況下,可能會導致程序僵死而不繼續往下執行

System.setProperty("sun.net.client.defaultConnectTimeout""30000");  

System.setProperty("sun.net.client.defaultReadTimeout""30000");  

 

其中: sun.net.client.defaultConnectTimeout:連接主機的超時時間(單位:毫秒)  

sun.net.client.defaultReadTimeout:從主機讀取數據的超時時間(單位:毫秒)  

  

JDK 1.5以前的版本,只能通過設置這兩個系統屬性來控制網絡超時。在1.5中,還可以使用HttpURLConnection的父類URLConnection的以下兩個方法:  

setConnectTimeout:設置連接主機超時(單位:毫秒)  

setReadTimeout:設置從主機讀取數據超時(單位:毫秒)  

  

例如:  

HttpURLConnection urlCon = (HttpURLConnection)url.openConnection();  

urlCon.setConnectTimeout(30000);  

urlCon.setReadTimeout(30000);  


發佈了7 篇原創文章 · 獲贊 7 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章