1. 程式人生 > >(轉)詳解HttpURLConnection

(轉)詳解HttpURLConnection

(轉)詳解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

 

1

2

3

4

5

6

7

8

9

10

11

[java] view plain copy

  

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引數

 

複製程式碼

[java] view plain copy
 
// 設定請求的方法為"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建立連線

 

複製程式碼

[java] view plain copy
 
// 此處getOutputStream會隱含的進行connect(即:如同呼叫上面的connect()方法,    
// 所以在開發中不呼叫上述的connect()也可以)。    
OutputStream outStrm = httpUrlConnection.getOutputStream();    
[java] view plain copy
 
  

複製程式碼

 

getInputStream()也是同理。

 

HttpURLConnection傳送請求

 

複製程式碼

[java] view plain copy
 
// 現在通過輸出流物件構建物件輸出流物件,以實現輸出可序列化的物件。    
ObjectOutputStream objOutputStrm = new ObjectOutputStream(outStrm);    
     
// 向物件輸出流寫出資料,這些資料將存到記憶體緩衝區中    
objOutputStrm.writeObject(new String("我是測試資料"));    
     
// 重新整理物件輸出流,將任何位元組都寫入潛在的流中(些處為ObjectOutputStream)    
objOutputStm.flush();    
    
// 關閉流物件。此時,不能再向物件輸出流寫入任何資料,先前寫入的資料存在於記憶體緩衝區中,    
// 在呼叫下邊的getInputStream()函式時才把準備好的http請求正式傳送到伺服器    
objOutputStm.close();    
 

複製程式碼

 

  1.  

HttpURLConneciton獲取響應

 // 呼叫HttpURLConnection連線物件的getInputStream()函式,  

InputStream inStrm = httpConn.getInputStream(); 

設定POST引數

 

複製程式碼

[java] view plain copy
 
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);