android兩種基本聯網方式與一種第三方開源項目的使用,android開源項目
安卓請求網絡的三種方式
在請求網絡的時候一般常用的提交方式是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();
}
});