標籤:判斷 網域名稱 multi 網路 tpc 決定 選擇 實現 eth
android+php 安卓與伺服器的資料互動在我們進行android開發的時候,避免不了的要進行登入註冊,個人資訊擷取,資料互動等等這一系列的操作。這樣就需要進行android端與伺服器端進行資料的互動。但如何讓他們進行資料的一個互動,我在這裡也踩了不少坑,不過最後也算是互動成功了,下面我把我的方法寫一下,不敢說是最好的,最起碼是可以使用的,也請大家多多指教。
在通過上網查資料的時候,我發現android想要往伺服器端傳遞資料的話可以使用的方法非常的多。HttpClient ,HttpResponse ,OkHttpClient ,HttpURLConnection等等好多的方法,但是我發現裡面有好多的方法所使用的包都是最原始的類庫中不存在的(也可能是我沒有找到合適的使用方法)。實驗到最後,我決定使用HttpURLConnection這個類來實現,因為感覺這個不需要另外再從網上下載其他的類庫,比較簡單方便,直接可以使用。伺服器端的話我是採用我比較熟悉的Apache+php來進行搭建的。
android與PHP的互動是通過http網路編程實現的。需要遵守http協議。通過http://www......網域名稱來實現訪問。利用PHP檔案作為介面進行資料庫的遠程操作。而android與PHP之間的數值傳遞是通過json資料類型。下面會有具體的java與PHP對於json資料類型的處理。下面我來展示一下。
第一步:首先需要先定義能訪問到你伺服器的url地址,可以直接填寫IP地址,也可以填寫能訪問到伺服器的網域名稱資訊。例如你可以填寫:http://www.myServer.com/test.php 或者 http://111.111.111.11/test.php,用一個URl類轉換一下。
//建立網路連接String url_str= "http://111.111.111.11/test.php";URL url=new URL(url_str);HttpURLConnection http = (HttpURLConnection)url.openConnection();
第二步:設定串連的參數設定網路連接的一些參數,利用post進行資料的傳輸,跟網頁的post傳遞類似。
//設定是否向httpUrlConnection 輸出,因為設定的是post請求,參數放在http本文中,因此需要設為true,預設情況下是false;http.setDoOutput(true);//設定是否從httpUrlConnection讀入,預設情況下是truehttp.setDoInput(true);//佈建要求方式http.setRequestMethod("POST");//設定 post請求不能使用緩衝http.setUseCaches(false);//這個設定比較重要,設定http請求的資料類型以及編碼格式,因為這裡使用json來傳遞資料,所以這一設定是json.http.setRequestProperty("Content-type", "application/json;charset=utf-8");//如果想要往後台傳遞圖片的話,這裡的設定有些不同,當然還會有其他的不同,這裡先不詳解了。//http.setRequestProperty("Connection", "Keep-Alive");//http.setRequestProperty("Charset", "UTF-8");//http.setRequestProperty("Content-Type", "multipart/form-data;boundary=" + "****");//建立串連http.connect();//還會有一些其他參數,這個參數的設定可以根據自己的實際情況進行選擇
第三步:擷取輸入資料流,寫入要傳遞的資料。
OutputStream out=http.getOutputStream(); //建立json對象並添加資料。 data = new JSONObject(); data.put("name","Myname"); data.put("password","MyPassword"); //post請求out.write(data.toString().getBytes());out.flush();out.close();
第四步:擷取伺服器端返回的資料。
//擷取網頁返回資料//擷取輸入資料流BufferedReader bufferedReader =new BufferedReader(new InputStreamReader(http.getInputStream()));String line ="";StringBuilder builder = new StringBuilder(); //建立輸入緩衝區while(null != (line=bufferedReader.readLine())){ //結束會讀入一個null值 line = new String(line.getBytes(),"utf-8"); builder.append(line); //寫入緩衝區 }String result = builder.toString(); //返回結果bufferedReader.close();http.disconnect();//如果串連成功result裡面記錄的是後台返回的資料。
第五步:就是進行資料的解析,擷取後台返回的資料。
//把擷取的字串通過轉換成json形式的資料類型 JSONObject jsonObject=new JSONObject(result); //擷取裡面的資料 returnResult=jsonObject.getInt("status"); if(returnResult !=0){ //如果返回的json裡還有數組,需要用jsonArray進行擷取,然後再從擷取的資料裡逐個擷取json資料。 user_account=jsonObject.getString("telephone"); address=jsonObject.getString("address"); username=jsonObject.getString("username"); sex=jsonObject.getString("sex");
PHP伺服器端
PHP進行接收檔案的時候不用再用$_POST或者$_REQUEST進行資料的接收。因為android傳遞過來的不是表單的資料,而是一個資料流,所以需要進行輸入資料流的接收。
$data=json_decode(file_get_contents("php://input"),true);$data[···] = ····;.....return json_encode([‘status‘=>1,"message"=>"成功接收資料"]);
以我做的登入執行個體來進行全部代碼的展示。android端
private int login(String telephone,String password) throws IOException, JSONException { int returnResult=0; //建立網路連接 String urlstr="你的伺服器url地址"; URL url=new URL(urlstr); HttpURLConnection http=(HttpURLConnection)url.openConnection(); http.setDoOutput(true); http.setDoInput(true); http.setRequestMethod("POST"); http.setUseCaches(false); http.setRequestProperty("Content-type", "application/json;charset=utf-8"); http.connect(); //擷取輸入資料流,想伺服器寫入資料 OutputStream out=http.getOutputStream(); //post請求 JSONObject data=new JSONObject(); data.put("telephone",telephone); data.put("password",password); out.write(data.toString().getBytes()); out.flush(); out.close(); //讀取網頁返回的資料 BufferedReader bufferedReader=new BufferedReader(new InputStreamReader(http.getInputStream()));//擷取輸入資料流 String line=""; StringBuilder builder=new StringBuilder();//建立輸入緩衝區 while(null !=(line=bufferedReader.readLine())){ //結束會讀入一個null值 line=new String(line.getBytes(),"utf-8"); builder.append(line); //寫緩衝區 } String result=builder.toString(); //返回結果 bufferedReader.close(); http.disconnect(); try{ //擷取伺服器返回的Json資料 JSONObject jsonObject=new JSONObject(result); returnResult=jsonObject.getInt("status"); if(returnResult !=0){ user_account=jsonObject.getString("telephone"); address=jsonObject.getString("address"); username=jsonObject.getString("username"); sex=jsonObject.getString("sex"); if(username == null){ username ="未輸入暱稱"; } } } catch (JSONException e) { Log.e("log_tag", "the Error parsing data "+e.toString()); } return returnResult; }
php端
function Login(){ $value=array(); $data=array(); //php檔案接收輸入端傳遞的資料流 $value=json_decode(file_get_contents("php://input"),true); //尋找資料庫,判斷是否存在該使用者 $login=Db::name("Db_name")->where(‘telephone‘,$value[‘telephone‘])->find(); if(!$login){ return [‘status‘=>0]; }else{ $password=md5($value[‘password‘]); if($password == $login[‘password‘]){ return [‘status‘=>$login[‘id‘],"telephone"=>$login[‘telephone‘],‘username‘=>$login["username"],"address"=>$login["address"],"sex"=>$login["sex"]]; }else{ return [‘status‘=>0]; } } }
初次搭建android的後台,有什麼不妥的地方還請大家不吝賜教。
android + php 後台開發