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