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讀入,默認情況下是true
http.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的后台,有什么不妥的地方還請大家不吝賜教。