1. 程式人生 > >android客戶端與javaweb服務端通訊——登入小demo的啟示

android客戶端與javaweb服務端通訊——登入小demo的啟示

前兩天討論了javaweb專案連線mysql資料庫的注意事項,是因為剛剛租了一臺ecs雲伺服器,在上面搭載mysql要比Oracle方便很多,今天我們來探討一下android端與服務端通訊的方式方法,更多的是注意事項。

先說服務端,如果查詢成功,就返回一個由物件轉換而成的json

JsonTools jt =new JsonTools();//jsontools的功能是寫json;
jt.writeJson(users, response);//users是返回的物件,作為response返回,本句話的作用類似於request.setAttribute(arg0, arg1);
注:服務端會在json開頭加上字元:"\ufeff"
,將導致安卓版本為2.x的客戶端無法解析json,谷歌官方已在4.0以後的版本解決該問題。

然後是客戶端,因為要使用post方式傳參,所以使用HttpClient會方便很多。

URI uri=new URI(params[0]);
HttpClient client=new DefaultHttpClient();
HttpPost httppost=new HttpPost(uri);
List<NameValuePair> para=new ArrayList<NameValuePair>();
para.add(new BasicNameValuePair("lname", name));//待驗證的帳號
para.add(new BasicNameValuePair("lpass", pass));//密碼
UrlEncodedFormEntity formEntity=new UrlEncodedFormEntity(para,HTTP.UTF_8);//最後的HTTP.UTF-8一定要寫,否則String型別的資料傳到服務端,就會變成"??"亂碼
httppost.setEntity(formEntity);
HttpResponse response=client.execute(httppost);
				
if(HttpStatus.SC_OK==response.getStatusLine().getStatusCode()){//驗證服務端傳回來的狀態碼,200為正常
	HttpEntity entity=response.getEntity();
	InputStream in=entity.getContent();
					
	u=parseJSON(in);//將json解析為Users物件,將在下面詳解
					
	in.close();//關閉流
}
下面我們來探討一下客戶端解析服務端發來的json,一般來說,平時我們解析服務端傳來的大量json資料的時候,會用到JsonArray類作為遊標,然後遍歷JsonArray以取得每個物件,
但是對於登入來說,只會返回一個物件,所以不需要遍歷,直接使用JsonObject類對物件進行賦值,程式碼如下:
<pre name="code" class="java">private Users parseJSON(InputStream inStream) throws Exception{
		Users u=null;
		
		byte[] data=StreamTool.read(inStream);
		
		String json = new String(data);
		
		try {
			//JSONArray array=new JSONArray(json);//註釋掉是因為登入只會返回一個物件的json,不需要遍歷
			
			//for(int i=0;i<array.length();i++){//註釋掉是因為登入只會返回一個物件的json,不需要遍歷
				JSONObject jsonObject = new JSONObject(json);
				
				u=new Users();
				u.setId(jsonObject.getInt("id"));
				u.setLname(jsonObject.getString("lname"));
				u.setLpass(jsonObject.getString("lpass"));
				u.setAge(jsonObject.getInt("age"));
				Log.i("setting", u.getId()+u.getLname()+u.getLpass()+"");
			//}
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		return u;
	} 

至此,客戶端已經可以成功解析json了!