URLConnection 對于HTTP (RFC 2616) 用來發(fā)送和接受web數(shù)據(jù),數(shù)據(jù)可以是任意類型以及任意長度捶障。這個類可以被用來發(fā)送以及接受事先未知長度的流數(shù)據(jù)脓鹃。
使用這個類遵循以下模式:
- 通過調(diào)用URL.openConnection() 并且強制將結(jié)果轉(zhuǎn)換為HttpURLConnection,獲取一個新的HttpURLConnection實例疑苔。
- 準備請求双霍,主要的請求屬性是URI,請求頭也應該包括元數(shù)據(jù)例如證書,內(nèi)容類型栅屏,cookie會話。
- 可選上傳一個請求體堂鲜。如果需要包含一個請求體栈雳,使用setDoOutput(true)配置實例。通過向getOutputStream()返回的stream寫入發(fā)送數(shù)據(jù)缔莲。
- 讀取相應哥纫。響應頭通常包括元數(shù)據(jù)例如響應體的內(nèi)容類型和長度,修改日期和cookies會話痴奏。這個響應體可以通過getInputStream()返回的stream讀取數(shù)據(jù)蛀骇。如果相應沒有響應體,將會返回一個空的stream读拆。
- 斷開鏈接擅憔。一旦相應體被讀取,HttpURLConnection應該通過調(diào)用disconnect()關(guān)閉檐晕。Disconnecting釋放了被connection占用的資源暑诸,以便關(guān)閉或者重新使用。
URL url = new URL("http://www.android.com/");
HttpURLConnection urlConnection =(HttpURLConnection) url.openConnection();
try{
InputStream in = new BufferedInputStream(urlConnection.getInputStrea m());
readStream(in);
finally{
urlConnection.disconnect();
}
}
Secure Communication with HTTPS
調(diào)用openConnection() 在一個URL 使用 "https"模式辟灰,將會返回一個HttpsURLConnection个榕,允許重寫默認的HostnameVerifier和SSLSocket-Factory。
Response Handing
HttpURLConnection 將會跟隨 five HTTP redirects芥喇。它將會跟隨從源服務到另一個的從的重定向西采,此實現(xiàn)不遵循沖HTTPS到HTTP的重定向。
如果HTTP相應遇到了一個錯誤继控,getInputStream()將會拋出一個IOException械馆。使用getErrorStream去讀寫錯誤響應。通過調(diào)用getHeaderFields()將會正常讀取headers
Posting Content
上傳數(shù)據(jù)到web server,使用setDoOutput(true)配置輸出鏈接湿诊。
為了實現(xiàn)最好的性能狱杰,你也可以調(diào)用setFixedLengthStreamMode(int)當這個body長度事先知道,或者在不知道body長度時調(diào)用setChunkedStreamingMode(int)厅须。否則HttpURLConnection將會被強制在內(nèi)存中緩沖所有的請求體在他提交之前仿畸。浪費內(nèi)存堆增加了延遲。
HttpURLConnection UrlConnection = (HttpURLConnection) url.openConnection();
try{
urlConnection.setDoOutput(true);
urlConnection.setChunkedStreamingMode(0);
OutputStream out = new BufferedOutPutStream(urlConnection.getOutputStream());
writeStream(out);
InputStream in = new BufferedInputStream(urlConnection.getInputStream());
readStream(in);
finally{
urlConnection.disconnect();
}
}
設置鏈接參數(shù)的方法:
- setAllowUserInteraction
- setDoInput
- setDoOutput
- setlfModifiedSince
- setUseCaches
- setDefaultAllowUserInteraction
- setDefaultUseCaches
設置請求或響應頭:
Http請求允許一個key帶多個用逗號分開的values,但是HttpURLConnection只提供了單個操作方法
- setRequestProperty(key,value)
- addRequestProperty(key,value)
setRequsetProperty和addRequestProperty的區(qū)別就是错沽,setRequsetProperty會覆蓋已經(jīng)存在的key的所有values簿晓,有清零重新賦值的作用。而addRequestProperty則是在原來key的基礎(chǔ)上繼續(xù)添加其它value
發(fā)送URL請求:
建立實際鏈接之后千埃,就是發(fā)送請求憔儿,把請求參數(shù)傳到服務器,這就需要使用outputStream把請求參數(shù)傳給服務器:
- getOutputStream
獲取響應:
請求發(fā)送成功之后放可,即可獲取響應的狀態(tài)碼谒臼,如果成功,可以獲取響應中的數(shù)據(jù)耀里,獲取這些數(shù)據(jù)的方法包括:
- getContent
- getHeaderField
- getInputStream
對于大部分請求來說蜈缤,getInputStream和getContent用的是最多的。
相應的信息頭用以下方法獲确肟妗:
- getContentEncoding
- getContentLength
- getContentType
- getDate
- getExpiration
- getLastModifed