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。
創建實際鏈接以後,就是發送請求,把請求參數傳到服務器,這就須要使用outputStream把請求參數傳給服務器:
getOutputStream
請求發送成功以後,便可獲取響應的狀態碼,若是成功既能夠讀取響應中的數據,獲取這些數據的方法包括:
getContent
getHeaderField
getInputStream
對於大部分請求來講,getInputStream和getContent是用的最多的。
相應的信息頭用如下方法獲取:
getContentEncoding
getContentLength
getContentType
getDate
getExpiration
getLastModifed
任何網絡鏈接都須要通過socket才能鏈接,HttpURLConnection不須要設置socket,因此,HttpURLConnection並非底層的鏈接,而是在底層鏈接上的一個請求。這就是爲何HttpURLConneciton只是一個抽象類,自身不能被實例化的緣由。HttpURLConnection只能經過URL.openConnection()方法建立具體的實例。
雖然底層的網絡鏈接能夠被多個HttpURLConnection實例共享,但每個HttpURLConnection實例只能發送一個請求。請求結束以後,應該調用HttpURLConnection實例的InputStream或OutputStream的close()方法以釋放請求的網絡資源,不過這種方式對於持久化鏈接沒用。對於持久化鏈接,得用disconnect()方法關閉底層鏈接的socket。
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;
// 設定請求的方法爲"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();
// 此處getOutputStream會隱含的進行connect(即:如同調用上面的connect()方法, // 因此在開發中不調用上述的connect()也能夠)。 OutputStream outStrm = httpUrlConnection.getOutputStream();
getInputStream()也是同理。
// 如今經過輸出流對象構建對象輸出流對象,以實現輸出可序列化的對象。 ObjectOutputStream objOutputStrm = new ObjectOutputStream(outStrm); // 向對象輸出流寫出數據,這些數據將存到內存緩衝區中 objOutputStrm.writeObject(new String("我是測試數據")); // 刷新對象輸出流,將任何字節都寫入潛在的流中(些處爲ObjectOutputStream) objOutputStm.flush(); // 關閉流對象。此時,不能再向對象輸出流寫入任何數據,先前寫入的數據存在於內存緩衝區中, // 在調用下邊的getInputStream()函數時才把準備好的http請求正式發送到服務器 objOutputStm.close();
// 調用HttpURLConnection鏈接對象的getInputStream()函數,
InputStream inStrm = httpConn.getInputStream();
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);