詳解HttpURLConnection

請求響應流程

請求響應流程

設置鏈接參數的方法

  • setAllowUserInteractionjava

  • setDoInput緩存

  • setDoOutput服務器

  • setIfModifiedSince網絡

  • setUseCachesapp

  • setDefaultAllowUserInteractionsocket

  • setDefaultUseCaches函數

設置請求頭或響應頭

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

  • setRequestProperty(key,value)測試

  • addRequestProperty(key,value)url

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

URL url = new URL("http://localhost:8080/xxx.do");  
   
URLConnection rulConnection = url.openConnection();// 此處的urlConnection對象其實是根據URL的  
// 請求協議(此處是http)生成的URLConnection類  
// 的子類HttpURLConnection,故此處最好將其轉化  
// 爲HttpURLConnection類型的對象,以便用到  
// HttpURLConnection更多的API.以下:  
   
HttpURLConnection httpUrlConnection = (HttpURLConnection) rulConnection;

設置HttpURLConnection參數

// 設定請求的方法爲"POST",默認是GET  
httpUrlConnection.setRequestMethod("POST");  
  
// 設置是否向httpUrlConnection輸出,由於這個是post請求,參數要放在  
// http正文內,所以須要設爲true, 默認狀況下是false;  
httpUrlConnection.setDoOutput(true);  
   
// 設置是否從httpUrlConnection讀入,默認狀況下是true;  
httpUrlConnection.setDoInput(true);  
   
// Post 請求不能使用緩存  
httpUrlConnection.setUseCaches(false);  
   
// 設定傳送的內容類型是可序列化的java對象  
// (若是不設此項,在傳送序列化對象時,當WEB服務默認的不是這種類型時可能拋java.io.EOFException)  
httpUrlConnection.setRequestProperty("Content-type", "application/x-java-serialized-object");  
 
// 鏈接,從上述url.openConnection()至此的配置必需要在connect以前完成,  
httpUrlConnection.connect();

 

URLConnection創建鏈接

// 此處getOutputStream會隱含的進行connect(即:如同調用上面的connect()方法,  
// 因此在開發中不調用上述的connect()也能夠)。  
OutputStream outStrm = httpUrlConnection.getOutputStream();
getInputStream()也是同理。

HttpURLConnection發送請求

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

 

HttpURLConneciton獲取響應

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

InputStream inStrm = httpConn.getInputStream(); 

設置POST參數

OutputStream os = httpConn.getOutputStream();  
             String param = new String();  
             param = "CorpID=" + CorpID +  
                     "&LoginName=" + LoginName+  
                     "&send_no=" + phoneNumber +  
                     "&msg=" + java.net.URLEncoder.encode(msg,"GBK"); ;  
             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);  

相關文章
相關標籤/搜索