Android用戶端與PHP服務端通訊(二)---JSON互動,android---json
概述
本節通過一個簡單的demo程式簡單的介紹Android用戶端通過JSON向PHP服務端提交訂單,PHP服務端處理訂單後,通過JSON返回結果給Android用戶端。正常來講,PHP服務端在處理訂單過程中,需要與MySQL資料庫互動,這裡為了簡單起見,暫時省掉MySQL。
通訊格式
首先,需要定下用戶端與服務端之間通訊格式,如下表
Android用戶端
用戶端與服務端採用JSON資料格式通訊,同時採用HTTP通訊協定互動,採用POST方式提交結果。同時還要注意一點,與WEB伺服器通訊的過程需要另開闢一個線程進行資料的擷取,這樣可以防止擷取程式失敗之後,主線程還可以運行,我開始實驗的時候沒有注意到這一點,由於通訊失敗造成了程式停止運行。
同時由於需要網路通訊,所以需要在AndroidManifest.xml中添加如下許可權語句
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
程式的構造圖比較簡單,只有一個MainActivity.java。
運行效果為
MainActivity.java內容如下
package com.lygk.jsontest;import java.io.BufferedReader;import java.io.InputStreamReader;import java.util.ArrayList;import java.util.List;import org.apache.http.HttpEntity;import org.apache.http.HttpResponse;import org.apache.http.client.HttpClient;import org.apache.http.client.entity.UrlEncodedFormEntity;import org.apache.http.client.methods.HttpGet;import org.apache.http.client.methods.HttpPost;import org.apache.http.impl.client.DefaultHttpClient;import org.apache.http.message.BasicNameValuePair;import org.apache.http.params.CoreConnectionPNames;import org.apache.http.protocol.HTTP;import org.json.JSONObject;import com.example.jsontest.R;import android.app.Activity;import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.util.Log;import android.view.Menu;import android.view.MenuItem;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.Toast;public class MainActivity extends Activity { private static final String TAG="LYGK";Button BtnRequest;protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Log.i(TAG, "啟動程式 ");BtnRequest = (Button)findViewById(R.id.BtnRequest);//綁定事件來源和監聽器對象BtnRequest.setOnClickListener(new ButtonRequestListener());}//內部類,實現OnClickListener介面 //作為第二個按鈕的監聽器類 class ButtonRequestListener implements OnClickListener { public void onClick(View v) { Log.i(TAG, "按鈕按下 "); StartRequestFromPHP(); Log.i(TAG, "執行完畢 "); } } private void StartRequestFromPHP() { //建立線程 new Thread(){ public void run(){ try { SendRequest(); } catch (Exception e) { e.printStackTrace(); } } }.start(); } private void SendRequest(){ //通過HttpClient類與WEB伺服器互動 HttpClient httpClient = new DefaultHttpClient(); //定義與伺服器互動的地址 String ServerUrl = "http://www.bigbearking.com/study/guestRequest.php"; //設定讀取逾時,注意CONNECTION_TIMEOUT和SO_TIMEOUT的區別 httpClient.getParams().setParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, 5000); //設定讀取逾時 httpClient.getParams().setParameter(CoreConnectionPNames.SO_TIMEOUT, 5000); //POST方式 HttpPost httpRequst = new HttpPost(ServerUrl); //準備傳輸的資料 List<BasicNameValuePair> params = new ArrayList<BasicNameValuePair>(); params.add(new BasicNameValuePair("CMDID", "1")); params.add(new BasicNameValuePair("CUserName", "lygk")); params.add(new BasicNameValuePair("COrderName", "Apple")); params.add(new BasicNameValuePair("COrderNum", "2")); try{ //發送請求 httpRequst.setEntity(new UrlEncodedFormEntity(params, HTTP.UTF_8)); //得到響應 HttpResponse response = httpClient.execute(httpRequst); //傳回值如果為200的話則證明成功的得到了資料 if(response.getStatusLine().getStatusCode() == 200) { StringBuilder builder = new StringBuilder(); //將得到的資料進行解析 BufferedReader buffer = new BufferedReader(new InputStreamReader(response.getEntity().getContent())); //readLine()阻塞讀取 for(String s =buffer.readLine(); s!= null; s = buffer.readLine()) { builder.append(s); } System.out.println(builder.toString()); //得到Json對象 JSONObject jsonObject = new JSONObject(builder.toString()); //通過得到索引值對的方式得到值 int CmdId = jsonObject.getInt("CMDID"); String SResult = jsonObject.getString("SResult"); String SUserName = jsonObject.getString("SUserName"); int SResultPara = jsonObject.getInt("SResultPara"); Log.i(TAG, "讀取到資料 "); Log.i(TAG, "RequestResult:"+SResult); Log.i(TAG, "UserName:"+SUserName); //線上程中判斷是否得到成功從伺服器得到資料 } else{ Log.e(TAG, "連線逾時 "); } }catch (Exception e) { e.printStackTrace(); Log.e(TAG, "請求錯誤 "); Log.e(TAG, e.getMessage()); } return ; }}
Web服務端源碼
guestRequest.php內容:
<?php//擷取用戶端發來的請求資訊$CmdId = $_POST['CMDID'];$UserName = $_POST['CUserName'];$OrderName = $_POST['COrderName'];if($UserName != 'lygk'){$result = 'Fail';$resultpara = 2;//將資料存放區到資料中$arr = array('CMDID' => $CmdId,'SUserName' => $UserName,'SResult'=>$result,'SResultPara' =>$resultpara);//將數組轉成json格式進行傳遞$strr = json_encode($arr);}else{$result = 'Success';$resultpara = 1;//將資料存放區到資料中$arr = array('CMDID' => $CmdId,'SUserName' => $UserName,'SResult'=>$result,'SResultPara' =>$resultpara);//將數組轉成json格式進行傳遞$strr = json_encode($arr);}echo($strr);?>
運行軟體,點擊“發送請求”按鈕後,從LogCat可以看到運行資訊,WEB伺服器已經成功響應處理了Android用戶端發送的請求。
結尾
本章主要介紹了Android用戶端與WEB服務端的互動,貼的源碼比較多,發現講的原理少,其中個中細節,請君自行品味查閱。Android用戶端源碼,點此下載
/*****************************************************************************************************
*原創文章,轉載請註明網址:http://blog.csdn.net/mybelief321/article/details/45423143
*魯陽高科工作室
*網 址:www.bigbearking.com
*商務合作QQ:1519190237
*業 務 範 圍:網站建設、案頭軟體開發、Android\IOS開發、映像影視後期處理、PCB設計
****************************************************************************************************/