網路和I/O
一、網路HttpURLConnection 類
HttpURLConnection 類是基於HTTP協議的,其底層是通過Socket實現的。
URL請求的類別:
分為二類,GET與POST請求。二者的區別在於:
a:) get請求可以獲取靜態頁面,也可以把引數放在URL字串後面,傳遞給servlet,
b:) post與get的不同之處在於post的引數不是放在URL字串裡面,而是放在http請求的正文內。
Http協議支援的操作有GET、POST、HEAD、PUT、TRACE、OPTIONS、DELETE,其中最最常用的還是GET和POST操作,下面我們看一下GET和POST的區別。
GET:
GET請求可以被快取。 我們之前提到,當傳送鍵值對資訊時,可以在URL上面直接追加鍵值對引數。當用GET請求傳送鍵值對時,鍵值對會隨著URL一起傳送的。 由於GET請求傳送的鍵值對時隨著URL一起傳送的,所以一旦該URL被黑客截獲,那麼就能看到傳送的鍵值對資訊,所以GET請求的安全性很低,不能用GET請求傳送敏感的資訊(比如使用者名稱密碼)。 由於URL不能超過2048個字元,所以GET請求傳送資料是有長度限制的。 由於GET請求較低的安全性,我們不應該用GET請求去執行增加、刪除、修改等的操作,應該只用它獲取資料。
POST:
POST請求從不會被快取。 POST請求的URL中追加鍵值對引數,不過這些鍵值對引數不是隨著URL傳送的,而是被放入到請求體中傳送的,這樣安全性稍微好一些。 應該用POST請求傳送敏感資訊,而不是用GET。 由於可以在請求體中傳送任意的資料,所以理論上POST請求不存在傳送資料大小的限制。 當執行增減、刪除、修改等操作時,應該使用POST請求,而不應該使用GET請求。
a. 從客戶端得到服務端資料 GET
1、 示例1,如何得到HttpURLConnection 類,及使用它的各種方法,得到輸入流。
URL url=new URL(urlString);
HttpURLConnection connection= (HttpURLConnection) url.openConnection();
// 連結超時時間
connection.setConnectTimeout(30000);
connection.setRequestMethod("GET");
// 開始請求
connection.connect();
// 請求的狀態碼,200是成功,404等
int responseCode=connection.getResponseCode();
String responseMessage=connection.getResponseMessage();
String result=null;
if(responseCode==HttpURLConnection.HTTP_OK){
InputStream inputStream=connection.getInputStream();
示例2,如何得到HttpURLConnection 類,及使用它的各種方法,得到輸入流。
URL url = new URL(urlString); //URL物件
conn = (HttpURLConnection)url.openConnection(); //使用URL開啟一個連結
conn.setDoInput(true); //允許輸入流,即允許下載
conn.setDoOutput(true); //允許輸出流,即允許上傳
conn.setUseCaches(false); //不使用緩衝
conn.setRequestMethod("GET"); //使用get請求
is = conn.getInputStream(); //獲取輸入流,此時才真正建立連結
b.客戶端向服務端傳送資料 POST
// 設定是否向httpUrlConnection輸出,因為這個是post請求,引數要放在
2 // http正文內,因此需要設為true, 預設情況下是false;
3 httpUrlConnection.setDoOutput(true);
4
5 // 設定是否從httpUrlConnection讀入,預設情況下是true;
6 httpUrlConnection.setDoInput(true);
7
8 // Post 請求不能使用快取
9 httpUrlConnection.setUseCaches(false);
10
11 // 設定傳送的內容型別是可序列化的java物件
12 // (如果不設此項,在傳送序列化物件時,當WEB服務預設的不是這種型別時可能拋java.io.EOFException)
13 httpUrlConnection.setRequestProperty("Content-type", "application/x-java-serialized-object");
14
15 // 設定請求的方法為"POST",預設是GET
16 httpUrlConnection.setRequestMethod("POST");
17
18 // 連線,從上述第2條中url.openConnection()至此的配置必須要在connect之前完成,
19 httpUrlConnection.connect();
// 此處getOutputStream會隱含的進行connect(即:如同呼叫上面的connect()方法,
// 所以在開發中不呼叫上述的connect()也可以)。
OutputStream outStrm = httpUrlConnection.getOutputStream();
二、I/O
a.從網路得到資料輸入流,從輸入流解析到資料
1.a 一種解析輸入流的方式
Reader reader=new InputStreamReader(inputStream,"UTF-8");
char[] buffer=new char[1024];
reader.read(buffer);
result=new String(buffer);
1.b 一種解析輸入流的方式
reader = new BufferedReader(new InputStreamReader(is, "UTF-8"));
String strRead = null;
while ((strRead = reader.readLine()) != null) {
sbf.append(strRead);
sbf.append("\r\n");
}
reader.close();
result = sbf.toString();
2.解析為圖片, 引數is是輸入流
// ImageView設定Bitmap,用BitMap工廠解析輸入流
mIvShow.setImageBitmap(BitmapFactory.decodeStream(is));
b.客戶端向服務端傳送資料,POST時 輸出流
//獲取conn的輸出流
OutputStream os = conn.getOutputStream();
//讀取assets目錄下的person.xml檔案,將其位元組陣列作為請求體
requestBody = getBytesFromAssets("person.xml");
//將請求體寫入到conn的輸出流中
os.write(requestBody);
//記得呼叫輸出流的flush方法
os.flush();
//關閉輸出流
os.close();