Android用戶端與PHP服務端通訊(二)---JSON互動,android---json

來源:互聯網
上載者:User

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設計

****************************************************************************************************/


聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.