Android與PHP互動:客戶端用HTTP協議與服務端通訊
阿新 • • 發佈:2019-01-02
為了實現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。