Android網路訪問之http、https、 cookie的使用
最近公司做一個遊戲SDK,只有我一個人做~~~~~~~~,以前也沒做過這個,起初感覺無從下手,前前後後花了大概4周的時間,與第一家廠家對接完成的時候,總算鬆了口氣。專案中的網路模組,從http開始調通,然後加上cookie,最後換成https,感覺顯目的大半時間都花在這裡,下面把這一塊的知識總結一下,希望對正在看文章的你有一定的幫助~~
Google對安卓網路訪問這塊有一個專門的類:UrlConnection,這個是網路訪問類的超類,一般在使用中都是轉化為針對http協議封裝的HttpURLConnection類。http協議包括10幾種請求方式,常用的方式為Post、Get,所謂請求方式是客戶端與伺服器建立連線的時候告訴伺服器客戶端想要幹什麼,比如Get請求就是從伺服器獲取資料,POST可以往伺服器上傳資料。https是包含SSL連線的http,一般使用方式和http一樣,如果需要https證書,需要在建立連線的時候上傳證書到伺服器,之後就和http一樣了。cookie和session其實都是在頭部包含一串特殊的字串,其一般為一個鍵值對,作用為區分不同的客戶端,使用步驟一般是:伺服器在響應頭返回cookie,客戶端取出cookie在下一次訪問伺服器的時候再請求頭帶上cookie,這樣伺服器就可以知道這次請求是哪個客戶端建立的了(http連線是無狀態的,也就是說伺服器在建立連線的時候並不知道是哪個客戶端要求建立的)。下面就對這一塊知識做一個簡單的介紹。
Http之Get請求:
Get請求的缺點是隻能攜帶2K內的資料,並且可以看見攜帶的資料,不安全。優點就是方便。
請求示例:
HttpURLConnection conn = (HttpURLConnection) new URL(url).openConnection();
// 引數設定
conn.setReadTimeout(5 * 1000);
conn.setConnectTimeout(5 * 1000);
conn.setRequestMethod("GET");
// 判斷響應碼
if (conn.getResponseCode() == 200)
是不是感覺特別簡單呢~~~~~~~//獲取到返回的輸入流,用流的方式去處理返回的資料<span style="white-space:pre"> </span> InputStream is = conn.getInputStream();
Http之POST請求:
POST請求可以在建立連線的時候上傳資料到伺服器,資料已表格的形式上傳,保證了資料的安全性。
請求示例:
HttpURLConnection conn = (HttpURLConnection) new URL(url).openConnection(); // 引數設定 conn.setReadTimeout(5 * 1000); conn.setConnectTimeout(5 * 1000); <span style="color:#ff0000;">conn.setRequestMethod("POST");</span> // 開啟輸出流,往伺服器傳送資料,預設為關閉狀態 conn.setDoOutput(true); // 寫入的資料 <span style="color:#ff0000;">conn.getOutputStream().write(params.getBytes()); conn.getOutputStream().flush(); conn.getOutputStream().close();</span> // 判斷響應碼 if (conn.getResponseCode() == 200) <span style="white-space:pre"> </span>InputStream is = conn.getInputStream();
除了紅色的部分不一樣外其餘的都和Get請求一樣,是不是感覺也挺簡單的呢~~~~~~~·
帶cookie的http:
判斷伺服器返回的的頭部資訊是否有cookie,如果有,下次請求帶上cookie。
示例程式碼:
HttpURLConnection conn = (HttpURLConnection) new URL(url).openConnection();
<span style="white-space:pre"> <span style="color:#ff0000;"> </span></span><span style="color:#ff0000;">//判斷cookie是否為空
if (responseCookie != null) {
conn.addRequestProperty("Cookie", responseCookie);
}</span>
// 引數設定
conn.setReadTimeout(5 * 1000);
conn.setConnectTimeout(5 * 1000);
conn.setRequestMethod("POST");
// 開啟輸出流,往伺服器傳送資料,預設為關閉狀態
conn.setDoOutput(true);
// 寫入的資料
conn.getOutputStream().write(params.getBytes());
conn.getOutputStream().flush();
conn.getOutputStream().close();
<span style="color:#ff0000;"> //獲取到cookie
List<String> cookies = conn.getHeaderFields().get("Set-Cookie");
//把cookie得到之後取出裡面的值,然後儲存到一個字串裡面,請求的時候帶過去</span>
<span style="color:#ff0000;"> for (String cookie : cookies) {
responseCookie = cookie.split(";")[0];
responseCookie = responseCookie.split("\\.")[0];
}</span>
<span style="white-space:pre"> </span>// 判斷響應碼
<span style="white-space:pre"> </span>if (conn.getResponseCode() == 200)
<span style="white-space:pre"> </span>InputStream is = conn.getInputStream()
其中紅色的部分就是處理cookie的程式碼,別的和上面的是一樣的,那麼說了這麼多,cookie到底是什麼樣的呢?我在網上找了一個:Set-Cookie:customer=huangxp; path=/foo; domain=.ibm.com; ,其中紅色的部分就是cookie的具體內容,別的是一些路徑域名上面的,不需要管,只要下次在建立連線的時候帶上紅色的部分cookie問題就可以解決了~~~~~~~~····ok
https連線:
輪到https了,~~~~~~~~~~~~~,判斷一個連線是http連線還是https連線最簡單的方式就是直接看地址,如果以https開頭的就是https連線,以http開頭的就是http協議。下面的程式碼是需要證書連線的情況下的:
1.將url連線強轉為httpsUrlconnection像這樣:httpConn = (HttpsURLConnection) urlObj.openConnection();
2.得到一個SSLSocketFactory類
3.將連線設定SSLSocketFactory像這樣:httpConn.setSSLSocketFactory(socketFactory);
有沒有一種很簡單的感覺~~~~~~····
那麼SSLSocketFactory如何得到呢?看程式碼:
KeyStore ks = KeyStore.getInstance("PKCS12");
<span style="color:#ff0000;">InputStream ksIs = context.getResources().getAssets()
.open("client.p12");</span>
ks.load(ksIs, "123456".toCharArray());
ksIs.close();
KeyStore ts = KeyStore.getInstance("bks");
<span style="color:#ff0000;">InputStream tsIs = context.getResources().getAssets()
.open("client.truststore");</span>
ts.load(tsIs, "123456".toCharArray());
tsIs.close();
KeyManagerFactory kmf = KeyManagerFactory
.getInstance(KeyManagerFactory.getDefaultAlgorithm());
kmf.init(ks, "123456".toCharArray());
TrustManagerFactory tmf = TrustManagerFactory
.getInstance(TrustManagerFactory.getDefaultAlgorithm());
tmf.init(ts);
SSLContext ctx = SSLContext.getInstance("SSL");
ctx.init(kmf.getKeyManagers(), tmf.getTrustManagers(),
new SecureRandom());
SSLSocketFactory socketFactory = ctx.getSocketFactory();
return socketFactory;
也不多囉嗦了,說多了到底還不會用了 ,你直接拷貝上面的程式碼,把紅色的部分改成後臺給你的兩個證書的名字就ok~~,對了,記得把兩個證書放在asserts資料夾下面哦~~~~
最後把整個工具類提供給大家下載吧,功能有點強大,支援重定向,一般引數傳進去就可以的到結果啦~~~~
掃描關注我的微信公眾號:
好了,網路訪問算總結了一下了,寫的不是很詳細,大致的串了一遍。寫這個出了一點點意外~~~~~~就是寫了一半出去吃了個飯,回來不小心把瀏覽器關了~~~~~查看了下草稿箱發現沒有給我自動儲存~~~~~無語,你現在看見的是我後面又敲出來的~~~~~~~╮(╯▽╰)╭,希望這篇文章對你有幫助,有什麼問題歡迎給我留言,歡迎指出不對的地方~~~~