android客戶端與javaweb服務端通訊——登入小demo的啟示
阿新 • • 發佈:2019-01-25
前兩天討論了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"然後是客戶端,因為要使用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了!