Android網絡交互Get,POST簡介
做移動APP肯定少不了網絡交互,無論是打開網頁(如在手機端打開www.baidu.com)可是與服務器端交互(獲取資料信息,上傳或下載圖片等),都要用到網絡請求。我們常用的網絡請求就是HTTP中的GET與POST。android與網絡交互非常方便的,因為android主要是用java語言開發,所以直接使用java.net包下的API訪問HTTP服務。更方便的是,Android SDK附帶了Apache的HttpClient API。Apache HttpClient是一個完善的HTTP客戶端,它提供了對HTTP協議的全面支持,可以使用HTTP GET和POST等方法進行訪問,操作方便。下面也簡單介紹下兩種方式:
首先看下GET與POST方式的區別(參照網上資料):
(1)提交方式:GET提交,請求的數據寫在在URL中(就是把數據放置在HTTP協議頭中),以?分割URL和傳輸數據(參數),多個參數用& 連接。例 如:login.action?name=hyddd&password=idontknow&gender=male。如果數據中全是 英文字母/數字,原樣發送,如果有空格,轉換為+,如果有中文/其他字符,則直接把字符串用BASE64加密。POST提交:把提交的數據(參數)放置在 是HTTP包的包體中。 因此,GET提交的數據會在地址欄中顯示出來,而POST提交,地址欄不會改變
(2)傳輸數據的大小:HTTP協議沒有對傳輸的數據大小進行限制,HTTP協議規范也沒有對URL長度進行限制。在實際開發中存在的限制主要 是:GET:特定瀏覽器和服務器對URL長度有限制,其限制取決于操作系 統的支持。POST:由于不是通過URL傳值,理論上數據不受限。但實際各個WEB服務器會規定對post提交數據大小進行限制,Apache、IIS6 都有各自的配置。
(3)安全性:POST的安全性要比GET的安全性 高。這 里安全的含義是真正的Security的含義,比如:通過GET提交數據,用戶名和密碼將明文出現在URL上,因為(1)登錄頁面有可能被瀏覽器緩存, (2)其他人查看瀏覽器的歷史紀錄,那么別人就可以拿到你的賬號和密碼了,除此之外,使用GET提交數據還可能會造成Cross-site request forgery攻擊
(4)傳值(參)方法:GET:請求參數是作為一個key/value對的序列(查詢字符串)附加到URL上的查詢字符串的長度受到web瀏覽器和web服務器的限制(如IE最多支持2048個字符),不適合傳輸大型數據集同時,它很不安全。嘏POST:請求參數是在http標題的一個不同部分(名為entity body)傳輸的,這一部分用來傳輸表單信息,因此必須將Content-type設置為:application/x-www-form- urlencoded。post設計用來支持web窗體上的用戶字段,其參數也是作為key/value對傳輸。但是:它不支持復雜數據類型,因為post沒有定義傳輸數據結構的語義和規則。
再分別講講兩個方法的調用方法及步驟:
String url="http://......";//請求的網絡地址 //第一步,創建HttpClient對象 HttpClient client=new DefaultHttpClient(); //第二步,創建HttpGet對象 HttpGet httpGet = new HttpGet(url); //第三步,使用execute方法發送HTTP GET請求,并返回HttpResponse對象 HttpResponse response=client.execute(get); //第四步,判斷返回狀態并取出服務器返回的數據 if (httpResponse.getStatusLine().getStatusCode() == 200) { //第五步,使用getEntity方法活得返回結果 String result = EntityUtils.toString(httpResponse.getEntity()); }
String url="http://......";//請求的網絡地址 //第一步,創建HttpClient對象 HttpClient client=new DefaultHttpClient(); //第二步,創建HttpPost對象 HttpPost httpPost = new HttpPost(url); //第三步 設置HTTP POST請求參數必須用NameValuePair對象 NameValuePair loginName=new NameValuePair ("loginName","用戶名"); NameValuePair loginPwd=new NameValuePair ("loginPwd","密碼"); List<NameValuePair> params = new ArrayList<NameValuePair>(); params.add(loginName); params.add(loginPwd); //設置httpPost請求參數 httpPost.setEntity(new UrlEncodedFormEntity(params, HTTP.UTF_8)); //第四步,使用execute方法發送HTTP GET請求,并返回HttpResponse對象 HttpResponse response=client.execute(httpPost);; if (httpResponse.getStatusLine().getStatusCode() == 200) { //第五步,使用getEntity方法活得返回結果 String result = EntityUtils.toString(httpResponse.getEntity()); }