安卓請求網路的三種方式 在請求網路的時候一般常用的提交方式是post或者get請求,post請求安全,傳輸大小無限制,但是代碼量多些,get請求是瀏覽器有大小限制,用戶提交的信息在瀏覽器的地址欄顯示出來因此不安全 在Android中聯網請求需要添加許可權,4.0以後需要開啟一個線程,在網路請求的時候都 ...
安卓請求網路的三種方式 在請求網路的時候一般常用的提交方式是post或者get請求,post請求安全,傳輸大小無限制,但是代碼量多些,get請求是瀏覽器有大小限制,用戶提交的信息在瀏覽器的地址欄顯示出來因此不安全 在Android中聯網請求需要添加許可權,4.0以後需要開啟一個線程,在網路請求的時候都是以流的方式傳輸的 第一步使用系統URL的方式聯網 (熟練地瞭解,當伺服器需要傳入特殊的請求頭時候需要使用這種) get 關於names與passwords是用戶輸入要提交的數據 // 1.設置連接的網路地址,get請求就是拼接用戶提交的內容到URL重點註意事項:在安卓測試中ip地址不可寫localhost 因為安卓手機無法識別本地迴環地址,必須是指定的ip地址,否則執行到獲取響應碼一行時不執行,不報錯等,伺服器拿不到提交的信息, 也不會做出任何的反饋,所以執行到獲取反饋時無任何執行 String path = "http://172.17.25.55:8080/login/LoginServlet?username="+ names + "&password=" + passwords; // 2.創建一個URL的連接實例 URL url = new URL(path); // 3.通過URL的連接實例打開一個連接強轉成HttpURLConnection HttpURLConnection httpurlconn = (HttpURLConnection) url.openConnection(); // 然後設置請求的方式,這裡一定要大寫,GET httpurlconn.setRequestMethod("GET"); // 利用強轉後的連接設置請求響應超時 httpurlconn.setConnectTimeout(5000); // 獲取伺服器返回的響應碼 int responseCode = httpurlconn.getResponseCode(); // 如果響應碼是200就是成功,206是部分成功,404找不到頁面,504等是伺服器內部錯誤 if (responseCode == 200) { // 響應成功後拿到伺服器返回的數據,伺服器返回是以位元組流的形式返回 InputStream ins = httpurlconn.getInputStream(); // 讀取內容展示由於聯網是需要開線程的而UI不允許子線程更新所以在UI線程寫個方法在UI線程更新 } post 關於names與passwords是用戶輸入要提交的數據 //1.請求路徑 ☆☆☆☆☆☆☆重點註意事項:在安卓測試中ip地址不可寫localhost 因為安卓手機無法作為服務端,所以無法使用本地迴環地址,必須是指定的ip地址,否則執行到獲取響應碼一行時不執行,不報錯等, 伺服器拿不到提交的信息,也不會做出任何的反饋,所以執行到獲取反饋時無任何執行 String path = "http://172.17.25.55:8080/login/"; // 2.創建一個URL的連接實例 URL url = new URL(path); // 3.通過URL的連接實例打開一個連接強轉成HttpURLConnection HttpURLConnection con = (HttpURLConnection) url.openConnection(); // 利用強轉後的連接設置請求響應超時 con.setConnectTimeout(5000); // 然後設置請求的方式,這裡一定要大寫GET☆☆☆☆ con.setRequestMethod("POST"); // 請求體內容☆☆☆☆☆☆☆ String data = "username=" + names + "&password="+ passwords; //請求方式是固定的必須這麼寫包括大小寫這個是☆☆☆☆☆☆☆ con.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); //請求體(內容)的長度固定的必須這麼寫包括大小寫這個是☆☆☆☆☆ con.setRequestProperty("Content-Length", data.length()+""); con.setDoOutput(true);// 設置一個標記允許輸出數據☆☆☆☆☆ //寫入數據把我們組拼好的數據提交給伺服器以流的形式提交 ☆☆☆☆ con.getOutputStream().write(data.getBytes()) int responseCode = con.getResponseCode(); // 如果響應碼是200就是成功,206是部分成功,404找不到頁面,504等是伺服器內部錯誤 if (responseCode == 200) { // 響應成功後拿到伺服器返回的數據,伺服器返回是以位元組流的形式返回 InputStream ins = httpurlconn.getInputStream(); // 讀取內容展示由於聯網是需要開線程的而UI不允許子線程更新所以在UI線程寫個方法在UI線程更新 } 第二步使用系統結借鑒Alpha的封裝好的類(瞭解即可)原因是請求頭信息封裝好了但是過於複雜,第三方完全可以更好的替代 //[2.1]定義get方式要提交的路徑小細節如果提交中文要對name 和 pwd 進行一個urlencode 編碼 Get // 1.設置連接的網路地址,利用URLEncoder編碼用戶提交的數據這樣中文就能夠提交了,而且用戶的信息有一些保障 關於names與passwords是用戶提交的數據 String path ="http://172.17.25.55:8080/login/LoginServlet?username="+ URLEncoder.encode(names,"utf-8") + "&password=" +URLEncoder.encode(passwords,"utf-8") ; //2.獲取httpclient實力直接new它的子類 DefaultHttpClient dehttp = new DefaultHttpClient(); //3.準備get請求 HttpGet get = new HttpGet(path); //4.執行一個請求返回的是伺服器響應結果 HttpResponse httpresponse = dehttp.execute(get); //5.拿到伺服器響應碼 int statusCode = httpresponse.getStatusLine().getStatusCode(); if(statusCode==200){ //6.獲取伺服器返回的數據以實體的形式返回 InputStream content = httpresponse.getEntity().getContent(); //7.讀取展示結果 } Post String path = "http://172.17.25.55:8080/login/LoginServlet"; //2.獲取httpclient實力直接new他的子類 DefaultHttpClient dehttp = new DefaultHttpClient(); //3準備 post請求 HttpPost post = new HttpPost(path); //4.開始準備post提交的正文,以鍵值對的形成 /4.1準備一個集合存放NameValuePair List<NameValuePair> an = new ArrayList<NameValuePair>(); //4.2創建NameValuePair子類實現是BasicNameValuePair //創建需要提交的數據以key value的形式提交key是伺服器根據去取的key, BasicNameValuePair bnp1 = new BasicNameValuePair("username",names); BasicNameValuePair bnp2 = new BasicNameValuePair("password",passwords); //4.3添加到集合中 an.add(bnp1); an.add(bnp2); //4.4準備entity實體 new一個子類實現UrlEncodedFormEntity //UrlEncodedFormEntity需要的是一個List<? extends NameValuePair> UrlEncodedFormEntity uf = new UrlEncodedFormEntity(an); //4.5設置實體 post.setEntity(uf); //5.執行一個請求返回的是伺服器響應結果 HttpResponse httpresponse = dehttp.execute(post); //6.拿到伺服器響應碼 int statusCode = httpresponse.getStatusLine().getStatusCode(); if(statusCode==200){ //7.獲取伺服器返回的數據以實體的形式返回 InputStream content = httpresponse.getEntity().getContent(); //8.讀取展示結果 } 第三步使用開源項目Asynhttpclient(熟練掌握) 註意:使用Asynhttpclient需要導入第三方的com包,導完後報錯,一個市報名錯誤刪除即可還有一個是沒有導包,導入包即可使用 關於names與passwords是用戶提交的數據 Get // 1.設置連接的網路地址,利用URLEncoder編碼用戶提交的數據這樣中文就能夠提交了,而且用戶的信息有一些保障 String path = "http://172.17.25.55:8080/login/LoginServlet?username=" + URLEncoder.encode(names,"utf-8") + "&password=" +URLEncoder.encode(passwords,"utf-8") ; //2.創建一個asynchttp AsyncHttpClient ashttp = new AsyncHttpClient(); //3.進行get請求傳入一個路徑,與一個AsyncHttpResponseHandler響應線程 ashttp.get(path,new AsyncHttpResponseHandler() { //請求成功的回調方法 @Override public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) { //responseBody伺服器返回的正文statusCode伺服器返回的狀態碼, Header伺服器返回的響應頭信息 try { Toast.makeText(MainActivity.this,new String(responseBody,"gbk"), 0).show(); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } } //請求失敗回調的方法 @Override public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) { Toast.makeText(MainActivity.this,new String(responseBody), 0).show(); } }); Post String path = "http://172.17.25.55:8080/login/LoginServlet"; // 創建一個asynchttp AsyncHttpClient ashttp = new AsyncHttpClient(); //準備請求體內容 RequestParams params = new RequestParams(); params.put("username", names); params.put("password", passwords); //請求一個post請求 ashttp.post(path, params ,new AsyncHttpResponseHandler() { @Override public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) { try { Toast.makeText(MainActivity.this,new String(responseBody, "gbk"), 0).show(); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } @Override public void onFailure(int statusCode, Header[] headers,byte[] responseBody, Throwable error) { Toast.makeText(MainActivity.this, new String(responseBody),0).show(); } });