1. 程式人生 > >Android與PHP互動:客戶端用HTTP協議與服務端通訊

Android與PHP互動:客戶端用HTTP協議與服務端通訊

        為了實現Android客戶端和服務端的通訊,Android SDK為我們提供了Apache的HttpClient來方便我們使用各種HTTP服務。可以把HttpClient看成一個瀏覽器,通過它可以方便地發出GET請求和POST請求來獲得服務端響應。

下面我們先來實現一個GET請求:

//  		服務端負責處理請求頁面的URL,這裡你自己根據你的IP地址及檔案目錄進行填寫
			String baseURL = "http://10.15.67.10:8080/phptest1/index.php";
//			?後面跟要傳送的鍵值對,多個鍵值對之間用&連線。這裡第一個鍵值對的鍵名為name,鍵值為輸入的值;第二個鍵名為password,鍵值為輸入值。
			String URL = baseURL+"?name="+editText1.getText().toString()+"&password="+editText2.getText().toString();
			try{
			HttpGet httpGet = new HttpGet(URL);
			
			HttpParams params = new BasicHttpParams();
//			採用UTF-8編碼格式
	        params.setParameter("charset", HTTP.UTF_8);
//	                 設定連線超時時間為8秒
	        HttpConnectionParams.setConnectionTimeout(params, 8 * 1000);
//	                 設定資料請求時間為8秒
	        HttpConnectionParams.setSoTimeout(params, 8 * 1000);
//	                 新建一個Http客戶端物件
	        HttpClient httpClient = new DefaultHttpClient(params);
//	                  用該物件傳送GET請求,返回一個Http響應
	        HttpResponse httpResponse = httpClient.execute(httpGet);
//	                 判斷是否獲得正確的響應,然後執行相應的操作
		    if(httpResponse.getStatusLine().getStatusCode() == HttpStatus.SC_OK){
//					這裡要注意一下返回的結果用UTF-8編碼,否則當返回結果有中文時可能會出現亂碼。最好所有的地方都統一編碼
					String strResult = EntityUtils.toString(httpResponse.getEntity(),"UTF-8");
					if(strResult.equals("loginsuccess")){
//				    	登入成功 ToDO
						Log.d("debug", strResult);
					}
					else {
//					 	登入失敗 ToDo
						Log.d("debug", strResult);
					}
		        }	
			}
			catch(Exception e){		
				Log.d("debug", "GETFAILED:"+e.toString());
			}


接下來是POST請求:

			String username = editText1.getText().toString();
			String userpassword = editText2.getText().toString();
//			新建名值對,用於儲存要傳送的資料
			NameValuePair nameValuePair1 = new BasicNameValuePair("name", username);
			NameValuePair nameValuePair2 = new BasicNameValuePair("password", userpassword);
//			將建立好的名值對加入到list中
			List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
			nameValuePairs.add(nameValuePair1);
			nameValuePairs.add(nameValuePair2);
			
			try{
	//		  	用剛才的list填充一個http請求實體,並採用UTF-8編碼
				HttpEntity requesteEntity = new UrlEncodedFormEntity(nameValuePairs,HTTP.UTF_8);
	//			第一個POST請求
				HttpPost httpPost = new HttpPost(baseURL);
	//			設定POST請求的資料實體
				httpPost.setEntity(requesteEntity);
				
				HttpParams parms = new BasicHttpParams();
	//			設定超時時間和請求時間
		        HttpConnectionParams.setConnectionTimeout(parms, 8 * 1000);
		        HttpConnectionParams.setSoTimeout(parms, 8 * 1000);
	//	                 新建一個http客戶端物件
		        HttpClient httpClient = new DefaultHttpClient(parms);
	//	                 傳送POST請求,返回一個http響應
				HttpResponse httpResponse = httpClient.execute(httpPost);
				
				if(httpResponse.getStatusLine().getStatusCode() == 200){
//					返回響應的結果
					String strResult = EntityUtils.toString(httpResponse.getEntity(),"UTF-8");
					if(strResult.equals("loginsuccess")){
//				    	登入成功 ToDO
						Log.d("debug", strResult);
					}
					else {
//					 	登入失敗 ToDo
						Log.d("debug", strResult);
					}
					
				}
				else{
					Log.d("debug", "Error Response:"+httpResponse.getStatusLine().toString());	
				}
			}
			catch(Exception e){
				Log.d("debug", e.toString());
			}

http://10.15.67.10:8080/phptest1/index.php

<?php
//判斷全域性變數GET和POST對應的鍵名是否被賦值
if(isset($_GET["name"])&&isset($_GET["password"])){
	$name = $_GET["name"];
	$password = $_GET["password"];
}
if(isset($_POST["name"])&&isset($_POST["password"])){
	$name = $_POST["name"];
	$password = $_POST["password"];
}
//如果客戶端輸入的使用者名稱為admin,密碼為111111則登入成功。在實際專案中當然是查詢資料庫進行判斷啦。。
if($name == 'admin'&&$password == '111111'){
	echo "loginsuccess";
}
else{
	echo "loginfailed";
}

當然,不要忘了在Androidmanifest檔案中加上訪問網路的許可權

<uses-permission android:name="android.permission.INTERNET"/>

還有一點要值得注意的是,Android不準在主執行緒中執行網路操作,所以在執行上述操作的時候要在一個子執行緒中完成,然後可以用handler非同步更行UI。