详解android与服务端交互的两种方式
做Android开发的程序员必须知道android客户端应该如何与服务端进行交互,这里主要介绍的是使用json数据进行交互。服务端从数据库查出数据并以json字符串的格式或者map集合的格式返回到客户端,客户端进行解析并输出到手机屏幕上。
此处介绍两种方式:使用Google原生的Gson解析json数据,使用JSONObject解析json数据
一、使用Google原生的Gson解析json数据:
记得在客户端添加gson.jar。
核心代码:
服务端:
packagecom.mfc.ctrl; importjava.util.HashMap; importjava.util.List; importjava.util.Map; importjavax.annotation.Resource; importjavax.servlet.http.HttpServletRequest; importorg.springframework.stereotype.Controller; importorg.springframework.web.bind.annotation.RequestMapping; importorg.springframework.web.bind.annotation.ResponseBody; importcom.mfc.dao.TblUserDao; importcom.mfc.entity.TblUser; /** *2017年7月6日06:26:40 *对用户操作的控制器类 **/ @Controller @RequestMapping("tblUserCtrl") publicclassTblUserCtrl{ @Resource(name="tblUserDao") TblUserDaotblUserDao; //添加用户 @RequestMapping("addUser") @ResponseBody publicObjectaddUser(HttpServletRequestrequest){ Stringuname=request.getParameter("uname"); Stringupass=request.getParameter("upass"); floatmoney=Float.parseFloat(request.getParameter("money")); System.out.println(uname+"==="+upass+"==="+money); TblUsertblUser=newTblUser(); tblUser.setMoney(money); tblUser.setUname(uname); tblUser.setUpass(upass); tblUserDao.addUser(tblUser); Mapmap=newHashMap (); map.put("success","success"); returnmap; } //查看所有用户 @RequestMapping("getAllUser") @ResponseBody publicObjectgetAllUser(){ List list=tblUserDao.selectAllUser(); Map map=newHashMap (); map.put("list",list); returnmap; } //删除用户 @RequestMapping("delUser") @ResponseBody publicObjectdelUser(HttpServletRequestrequest){ intuid=Integer.parseInt(request.getParameter("uid")); TblUsertblUser=tblUserDao.getUserById(uid); tblUserDao.delUser(tblUser); Map map=newHashMap (); map.put("success","success"); returnmap; } //修改用户 @RequestMapping("updateUser") @ResponseBody publicObjectupdateUser(HttpServletRequestrequest){ intuid=Integer.parseInt(request.getParameter("uid")); Stringuname=request.getParameter("uname"); Stringupass=request.getParameter("upass"); floatmoney=Float.parseFloat(request.getParameter("money")); TblUsertblUser=newTblUser(); tblUser.setMoney(money); tblUser.setUid(uid); tblUser.setUname(uname); tblUser.setUpass(upass); tblUserDao.updateUser(tblUser); Map map=newHashMap (); map.put("success","success"); returnmap; } }
客户端:
拼接URL的类:
packagecom.mfc.urlutils; importjava.util.Map; /** *2017年7月6日06:42:10 *一些URL需要使用的公用数据及方法 **/ publicclassSomePublicData{ //公用path publicstaticfinalStringpath="http://192.168.0.111:8080/MyeclipseService/tblUserCtrl/"; //拼接path publicstaticStringfullPath(Stringpathlast,Mapmap){ StringBuilderbuilder=newStringBuilder(); StringrealPath=null; if(map!=null&&!map.isEmpty()){ //拼接url的参数部分 for(Map.Entry entrty:map.entrySet()){ builder.append(entrty.getKey()).append("="); builder.append(entrty.getValue()).append("&"); } builder.deleteCharAt(builder.length()-1); //拼接最后完整的url realPath=SomePublicData.path+pathlast+"?"+builder; returnrealPath; } returnSomePublicData.path+pathlast; } }
访问服务器的类:
packagecom.mfc.urlutils; importjava.io.BufferedReader; importjava.io.IOException; importjava.io.InputStreamReader; importorg.apache.http.HttpEntity; importorg.apache.http.HttpResponse; importorg.apache.http.client.ClientProtocolException; importorg.apache.http.client.HttpClient; importorg.apache.http.client.methods.HttpGet; importorg.apache.http.impl.client.DefaultHttpClient; importorg.apache.http.params.HttpConnectionParams; importorg.apache.http.params.HttpParams; /** *2017年7月6日06:55:26 *将客户端数据传送到服务器,并接受服务器返回的数据 **/ publicclassSendDateToServer{ publicstaticStringsendToServer(Stringpath){ StringBuilderbuilder=newStringBuilder(); try{ HttpClientclient=newDefaultHttpClient(); if(path!=null&&path.length()>0){ if(client!=null){ HttpParamshttpParams=client.getParams(); if(httpParams!=null){ HttpConnectionParams.setConnectionTimeout(httpParams,60000); HttpConnectionParams.setSoTimeout(httpParams,60000); HttpGetget=newHttpGet(path); if(get!=null){ HttpResponsehttpResponse=client.execute(get); if(httpResponse!=null){ HttpEntityentity=httpResponse.getEntity(); if(entity!=null){ BufferedReaderbufferedReader=newBufferedReader(newInputStreamReader(entity.getContent())); Stringline=null; while((line=bufferedReader.readLine())!=null){ builder.append(String.format("%s\n",line)); } bufferedReader.close(); } } } } } } }catch(ClientProtocolExceptione){ e.printStackTrace(); }catch(IOExceptione){ e.printStackTrace(); } returnbuilder.toString(); } }
解析json数据的类:
packagecom.mfc.jsonutils; importjava.util.ArrayList; importjava.util.List; importorg.json.JSONObject; importcom.google.gson.Gson; importcom.google.gson.JsonArray; importcom.google.gson.JsonElement; importcom.google.gson.JsonParser; importcom.mfc.entity.TblUser; /** *2017年7月6日07:15:32 *解析json数据的类 **/ publicclassGetJsonToEntity{ //解析单个数据 publicstaticTblUsergetTblUser(StringjsonString){ Gsongson=newGson(); TblUsertblUser=gson.fromJson(jsonString,TblUser.class); returntblUser; } //解析list集合 publicstaticListgetTblUserList(StringgsonString){ List listusers=GsonUtil.parseJsonArrayWithGson(gsonString,TblUser.class); returnlistusers; } } /** *2017年7月6日15:45:43 *封装的json解析工具类,提供泛型参数 **/ classGsonUtil{ //将json数据解析成相应的映射对象 publicstatic TparseJsonWithGson(StringjsonData,Class type){ Gsongson=newGson(); Tresult=gson.fromJson(jsonData,type); returnresult; } //将json数组解析成相应的映射对象列表 publicstatic List parseJsonArrayWithGson(StringjsonData,Class type){ List result=newArrayList (); try{ Gsongson=newGson(); JSONObjectjsonObject=newJSONObject(jsonData); Stringstring=jsonObject.getString("list"); JsonArrayarry=newJsonParser().parse(string).getAsJsonArray(); for(JsonElementjsonElement:arry){ result.add(gson.fromJson(jsonElement,type)); } }catch(Exceptione){ e.printStackTrace(); } returnresult; } }
调用这些方法的Activity以及实体类省略。
二、使用JSONObject解析json数据
注意:服务端要添加json的jar包。
客户端解析json数据的代码:
packagecom.mfc.jsonutils; importjava.util.ArrayList; importjava.util.HashMap; importjava.util.Iterator; importjava.util.List; importjava.util.Map; importorg.json.JSONArray; importorg.json.JSONException; importorg.json.JSONObject; importcom.mfc.entity.Task; /** *2017年6月25日21:34:44 *解析json的工具类 *这里面所有方法的key,都是json一层数据的键,注意传数据时调用本类方法的时候给的key值 **/ publicclassParseJson{ //解析单条数据 publicstaticTaskgetTask(Stringkey,Stringjson){ Tasktask=newTask(); try{ JSONObjectjsonObject=newJSONObject(json); JSONObjecttaskObject=jsonObject.getJSONObject(key); task.setTid(taskObject.getInt("uid")); task.setContent(taskObject.getString("content")); task.setIssuccess(taskObject.getInt("issuccess")); task.setTasktime(taskObject.getString("tasktime")); task.setTitle(taskObject.getString("title")); task.setUid(taskObject.getInt("uid")); }catch(JSONExceptione){ e.printStackTrace(); } returntask; } //解析list集合 publicstaticListgetListTask(Stringkey,StringjsonString){ List list=newArrayList (); try{ JSONObjectjsonObject=newJSONObject(jsonString); //解析json数组 JSONArrayarray=jsonObject.getJSONArray(key); for(inti=0;i getList(Stringkey,StringjsonString){ List list=newArrayList (); try{ JSONObjectjsonObject=newJSONObject(jsonString); JSONArrayjsonArray=jsonObject.getJSONArray(key); for(inti=0;i >getListMap(Stringkey,StringjsonString){ List
客户端接收服务端的数据方法:
packagecom.mfc.urlutils; importjava.io.ByteArrayOutputStream; importjava.io.IOException; importjava.io.InputStream; importjava.net.HttpURLConnection; importjava.net.MalformedURLException; importjava.net.URL; importorg.apache.http.entity.StringEntity; importandroid.util.Log; publicclassHttpUtils{ staticStringTAG="HttpUtils"; /** *从服务器获取json数据 **/ publicstaticStringgetJsonContent(Stringpath){ StringjsonString=""; try{ URLurl=newURL(path); HttpURLConnectionconnection=(HttpURLConnection)url.openConnection(); connection.setConnectTimeout(3000); connection.setRequestMethod("GET"); connection.setDoInput(true); intcode=connection.getResponseCode(); if(code==200){ InputStreaminputStream=connection.getInputStream(); ByteArrayOutputStreamoutputStream=newByteArrayOutputStream(); intlen=0; byte[]data=newbyte[1024]; while((len=inputStream.read(data))!=-1){ outputStream.write(data,0,len); } jsonString=newString(outputStream.toByteArray()); Log.i(TAG,jsonString); } }catch(MalformedURLExceptione){ e.printStackTrace(); }catch(IOExceptione){ e.printStackTrace(); } returnjsonString; } }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。