在Android項目中使用到了HttpURLConnection請求資源,對于其中的方法setrequestproperty()的調用順序有些疑惑。
API注釋如下所示:
即:這個方法只能夠在連接建立之前調用。
也就是說,該方法只能在連接建立之前調用才能使得設置的相應參數生效。
我的問題是:如果調用了setRequestProperty(name,value)之后沒有明確調用connect()方法,那設置的參數是否會生效呢?
第一直覺是如果調用了setRequestProperty(name,value)之后沒有明確調用connect()方法,那么設置的對應參數是不會生效的!
為了驗證我的想法,做了如下驗證:
實驗一:在調用setRequestProperty(name,value)之后,調用getInputStream()之前沒有明確調用connect()方法,代碼如下所示:
String resource = “http://www.blogjava.net/supercrsky/articles/247449.html”;
URL url = new URL(resource);
HttpURLConnection conn = (HttpURLConnection)url.openConnection();
conn.setRequestProperty(“Content-Type”, “text/plain; charset=utf-8”);
//conn.connect();
InputStream is = conn.getInputStream();
byte[] buffer = new byte[1024];
int count = -1;
ByteArrayOutputStream bos = new ByteArrayOutputStream();
while((count = is.read(buffer)) > 0) {
bos.write(buffer, 0, count);
}
buffer = bos.toByteArray();
System.out.println(new String(buffer,”UTF-8″));
conn.disconnect();
運行程序,抓包結果:
GET /supercrsky/articles/247449.html HTTP/1.1
Content-Type: text/plain; charset=utf-8 // 顯然,設置的屬性生效了!
User-Agent: Java/1.6.0_21
Host: www.blogjava.net
Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2
Connection: keep-alive
實驗二:在調用setRequestProperty(name,value)之后,調用getInputStream()之前明確調用connect()方法,代碼如下所示:
String resource = “http://www.blogjava.net/supercrsky/articles/247449.html”;
URL url = new URL(resource);
HttpURLConnection conn = (HttpURLConnection)url.openConnection();
conn.setRequestProperty(“Content-Type”, “text/plain; charset=utf-8”);
conn.connect();
InputStream is = conn.getInputStream();
byte[] buffer = new byte[1024];
int count = -1;
ByteArrayOutputStream bos = new ByteArrayOutputStream();
while((count = is.read(buffer)) > 0) {
bos.write(buffer, 0, count);
}
buffer = bos.toByteArray();
System.out.println(new String(buffer,”UTF-8″));
conn.disconnect();
運行程序,抓包結果:
GET /supercrsky/articles/247449.html HTTP/1.1
Content-Type: text/plain; charset=utf-8 // 顯然,設置的屬性也生效了!
User-Agent: Java/1.6.0_21
Host: www.blogjava.net
Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2
Connection: keep-alive
結論:
1. 很顯然,不論是否明確調用connect()方法,通過setRequestProperty(name,value)設置的屬性都生效了,那這是為什么呢?
經過一番查證,原來是在調用getInputStream()方法中會檢查連接是否已經建立,如果沒有建立,則會調用connect()方法,所以疑惑解開了!
原來是在調用getInputStream()的時候會做連接是否建立的檢查!
2. 那么,在寫代碼的時候是否需要明確調用connect()呢?
個人建議還是明確調用一些比較好,因為這樣對于程序員自己來說是一個明確的控制,否則埋藏一些隱性的BUG,難以察覺。
相關資料:
(1)參考:http://www.blogjava.net/supercrsky/articles/247449.html
(2)HttpURLConnection源碼:http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/sun/net/www/protocol/http/HttpURLConnection.java#HttpURLConnection.plainConnect%28%29
本文由 貴州做網站公司 整理發布,部分圖文來源于互聯網,如有侵權,請聯系我們刪除,謝謝!
網絡推廣與網站優化公司(網絡優化與推廣專家)作為數字營銷領域的核心服務提供方,其價值在于通過技術手段與策略規劃幫助企業提升線上曝光度、用戶轉化率及品牌影響力。這...
在當今數字化時代,公司網站已成為企業展示形象、傳遞信息和開展業務的重要平臺。然而,對于許多公司來說,網站建設的價格是一個關鍵考量因素。本文將圍繞“公司網站建設價...
在當今的數字化時代,企業網站已成為企業展示形象、吸引客戶和開展業務的重要平臺。然而,對于許多中小企業來說,高昂的網站建設費用可能會成為其發展的瓶頸。幸運的是,隨...
蘋果11省電設置?蘋果11可以內步驟并且省電:1、然后打開可以設置,向下滑動列表,不能找到電池菜單,進入頁面,將低電量模式右邊的開關開啟;2、降底手機屏幕亮度,在“設置里”里“沒顯示與亮度”,直接關閉手機的“自動亮度調節”,并將屏幕亮度恒定在40%左右;3、會減少手機又出現在鎖屏上的推送通知數量,直接進入“設置”,在“通知”里,直接點擊查找app,中,選擇性關掉或所有的關閉;4、關掉手機的健康探測...
華為p40pro直播清晰度怎樣?很高興啊問你的問題,我是華強北阿浪同學關注我手機知識全清楚。要明白了華為p40pro網絡直播清晰度如何能就需要先了解手機攝像頭的參數華為p40pro后置攝像頭是5000萬像素主攝4000萬像素超廣角鏡頭800萬像素超級變焦攝像頭800萬像素長焦攝像頭3D深覺鏡頭巳經達到了相機級像素前置攝像頭呢是3200萬像素微距攝像頭也是相機級像素傳感器類型tRYYB傳感器型號t索...
蚌埠怎么讀?你好蚌埠拼音:bngb蚌埠市,安徽省第一個地級市、省轄市(公元1947年),位于安徽省東北部,有蚌山區、禹會區、淮上詳gtgt。安徽蚌埠怎么念?1.clam發音為:bng,bng,聲母:b,韻母:ang和eng,聲調:四聲。2.發音為:b,聲母:B,韻母:U,聲調:四聲。蚌埠,簡稱“蚌埠”,或稱明珠市,是安徽省的一個地級市。蚌埠位于東部,長江三角洲西部,安徽省東北部,淮河中游,南北地理...