详解android与服务端交互的两种方式

做Android开发的程序员必须知道android客户端应该如何与服务端进行交互,这里主要介绍的是使用json数据进行交互。服务端从数据库查出数据并以json字符串的格式或者map集合的格式返回到客户端,客户端进行解析并输出到手机屏幕上。

此处介绍两种方式:使用Google原生的Gson解析json数据,使用JSONObject解析json数据

一、使用Google原生的Gson解析json数据:

记得在客户端添加gson.jar。

核心代码:

服务端:

package com.mfc.ctrl;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import com.mfc.dao.TblUserDao;
import com.mfc.entity.TblUser;

/**
 * 2017年7月6日06:26:40
 * 对用户操作的控制器类
 * */
@Controller
@RequestMapping("tblUserCtrl")
public class TblUserCtrl {

  @Resource(name="tblUserDao")
  TblUserDao tblUserDao;

  //添加用户
  @RequestMapping("addUser")
  @ResponseBody
  public Object addUser(HttpServletRequest request){
    String uname=request.getParameter("uname");
    String upass=request.getParameter("upass");
    float money=Float.parseFloat(request.getParameter("money"));
    System.out.println(uname+"==="+upass+"==="+money);
    TblUser tblUser=new TblUser();
    tblUser.setMoney(money);
    tblUser.setUname(uname);
    tblUser.setUpass(upass);

    tblUserDao.addUser(tblUser);

    Map<String, Object> map=new HashMap<String, Object>();
    map.put("success", "success");
    return map;
  }

  //查看所有用户
  @RequestMapping("getAllUser")
  @ResponseBody
  public Object getAllUser(){
    List<TblUser> list = tblUserDao.selectAllUser();
    Map<String, Object> map=new HashMap<String, Object>();
    map.put("list", list);
    return map;
  }

  //删除用户
  @RequestMapping("delUser")
  @ResponseBody
  public Object delUser(HttpServletRequest request){
    int uid=Integer.parseInt(request.getParameter("uid"));
    TblUser tblUser=tblUserDao.getUserById(uid);
    tblUserDao.delUser(tblUser);
    Map<String, Object> map=new HashMap<String, Object>();
    map.put("success", "success");
    return map;
  }

  //修改用户
  @RequestMapping("updateUser")
  @ResponseBody
  public Object updateUser(HttpServletRequest request){
    int uid=Integer.parseInt(request.getParameter("uid"));
    String uname=request.getParameter("uname");
    String upass=request.getParameter("upass");
    float money=Float.parseFloat(request.getParameter("money"));
    TblUser tblUser=new TblUser();
    tblUser.setMoney(money);
    tblUser.setUid(uid);
    tblUser.setUname(uname);
    tblUser.setUpass(upass);
    tblUserDao.updateUser(tblUser);

    Map<String, Object> map=new HashMap<String, Object>();
    map.put("success", "success");
    return map;
  }
}

客户端:

拼接URL的类:

package com.mfc.urlutils;

import java.util.Map;

/**
 * 2017年7月6日06:42:10
 * 一些URL需要使用的公用数据及方法
 * */
public class SomePublicData {
  //公用path
  public static final String path="http://192.168.0.111:8080/MyeclipseService/tblUserCtrl/";

  //拼接path
  public static String fullPath(String pathlast, Map<String, String> map) {
    StringBuilder builder = new StringBuilder();
    String realPath = null;
    if(map!=null && !map.isEmpty()){
      //拼接url的参数部分
      for (Map.Entry<String, String> entrty : map.entrySet()) {
        builder.append(entrty.getKey()).append("=");
        builder.append(entrty.getValue()).append("&");
      }
      builder.deleteCharAt(builder.length()-1);
      //拼接最后完整的url
      realPath = SomePublicData.path+pathlast+"?"+builder;
      return realPath;
    }

    return SomePublicData.path+pathlast;
  }
}

访问服务器的类:

package com.mfc.urlutils;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.params.HttpConnectionParams;
import org.apache.http.params.HttpParams;

/**
 * 2017年7月6日06:55:26
 * 将客户端数据传送到服务器,并接受服务器返回的数据
 * */
public class SendDateToServer {

  public static String sendToServer(String path){
    StringBuilder builder=new StringBuilder();
    try {
      HttpClient client=new DefaultHttpClient();
      if(path != null && path.length() > 0){
        if(client != null){
          HttpParams httpParams=client.getParams();
          if(httpParams != null){
            HttpConnectionParams.setConnectionTimeout(httpParams, 60000);
            HttpConnectionParams.setSoTimeout(httpParams, 60000);
            HttpGet get=new HttpGet(path);
            if(get != null){
               HttpResponse httpResponse=client.execute(get);
               if(httpResponse != null){
                 HttpEntity entity=httpResponse.getEntity();
                 if(entity != null){
                   BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(entity.getContent()));
                   String line = null;
                   while((line = bufferedReader.readLine()) != null){
                     builder.append(String.format("%s\n", line));
                   }
                   bufferedReader.close();
                 }
               }
            }
          }
        }
      }
    } catch (ClientProtocolException e) {
      e.printStackTrace();
    } catch (IOException e) {
      e.printStackTrace();
    }
    return builder.toString();
  }
}

解析json数据的类:

package com.mfc.jsonutils;

import java.util.ArrayList;
import java.util.List;

import org.json.JSONObject;

import com.google.gson.Gson;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonParser;
import com.mfc.entity.TblUser;

/**
 * 2017年7月6日07:15:32
 * 解析json数据的类
 * */
public class GetJsonToEntity {

  //解析单个数据
  public static TblUser getTblUser(String jsonString){
    Gson gson = new Gson();
    TblUser tblUser = gson.fromJson(jsonString, TblUser.class);
    return tblUser;
  }

  //解析list集合
  public static List<TblUser> getTblUserList(String gsonString) {
    List<TblUser> listusers=GsonUtil.parseJsonArrayWithGson(gsonString, TblUser.class);

    return listusers;
  }

}
/**
 * 2017年7月6日15:45:43
 * 封装的json解析工具类,提供泛型参数
 * */
class GsonUtil{
  //将json数据解析成相应的映射对象
  public static <T> T parseJsonWithGson(String jsonData,Class<T> type){
    Gson gson=new Gson();
    T result = gson.fromJson(jsonData, type);
    return result;
  }

  //将json数组解析成相应的映射对象列表
  public static <T> List<T> parseJsonArrayWithGson(String jsonData,Class<T> type){
    List<T> result = new ArrayList<T>();
    try {
      Gson gson = new Gson();
      JSONObject jsonObject=new JSONObject(jsonData);
      String string=jsonObject.getString("list");
      JsonArray arry = new JsonParser().parse(string).getAsJsonArray();
      for (JsonElement jsonElement : arry) {
        result.add(gson.fromJson(jsonElement, type));
      }
    } catch (Exception e) {
      e.printStackTrace();
    }
    return result;
  }
}

调用这些方法的Activity以及实体类省略。

二、使用JSONObject解析json数据

注意:服务端要添加json的jar包。

客户端解析json数据的代码:

 package com.mfc.jsonutils;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import com.mfc.entity.Task;

/**
 * 2017年6月25日21:34:44
 * 解析json的工具类
 * 这里面所有方法的key,都是json一层数据的键,注意传数据时调用本类方法的时候给的key值
 * */
public class ParseJson {

  //解析单条数据
  public static Task getTask(String key,String json){
    Task task=new Task();
    try {
      JSONObject jsonObject=new JSONObject(json);
      JSONObject taskObject=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 (JSONException e) {
      e.printStackTrace();
    }
    return task;
  }

  //解析list集合
  public static List<Task> getListTask(String key,String jsonString){
    List<Task> list=new ArrayList<Task>();
    try {
      JSONObject jsonObject=new JSONObject(jsonString);
      //解析json数组
      JSONArray array=jsonObject.getJSONArray(key);
      for (int i = 0; i < array.length(); i++) {
        JSONObject jsonObject2=array.getJSONObject(i);
        Task task=new Task();
        task.setTid(jsonObject2.getInt("uid"));
        task.setContent(jsonObject2.getString("content"));
        task.setIssuccess(jsonObject2.getInt("issuccess"));
        task.setTasktime(jsonObject2.getString("tasktime"));
        task.setTitle(jsonObject2.getString("title"));
        task.setUid(jsonObject2.getInt("uid"));
        list.add(task);
      }
    } catch (JSONException e) {
      e.printStackTrace();
    }
    return list;
  }

  /**
   * 获取String数组数据
   * @param key
   * @param jsonString
   * @return
   */
  public static List<String> getList(String key,String jsonString){
    List<String> list = new ArrayList<String>();
    try {
      JSONObject jsonObject = new JSONObject(jsonString);
      JSONArray jsonArray = jsonObject.getJSONArray(key);
      for(int i=0;i<jsonArray.length();i++){
        String msg = jsonArray.getString(i);
        list.add(msg);
      }
    } catch (JSONException e) {
      e.printStackTrace();
    }
    return list;
  }
  /**
   * 获取对象的Map集合数据
   * @param key
   * @param jsonString
   * @return
   */
  public static List<Map<String,Object>> getListMap(String key,String jsonString){
    List<Map<String,Object>> list = new ArrayList<Map<String,Object>>();
    try {
      JSONObject jsonObject = new JSONObject(jsonString);
      JSONArray jsonArray = jsonObject.getJSONArray(key);
      for(int i=0;i<jsonArray.length();i++){
        JSONObject jsonObject2 = jsonArray.getJSONObject(i);
        Map<String,Object> map = new HashMap<String, Object>();
        Iterator<String> iterator = jsonObject2.keys();
        while(iterator.hasNext()){
          String json_key = iterator.next();
          Object json_value = jsonObject2.get(json_key);
          if(json_value==null){
            json_value = "";
          }
          map.put(json_key, json_value);
        }
        list.add(map);
      }
    } catch (JSONException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    } 

    return list;
  } 

}

客户端接收服务端的数据方法:

package com.mfc.urlutils;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

import org.apache.http.entity.StringEntity;

import android.util.Log;

public class HttpUtils {
  static String TAG="HttpUtils";

  /**
   * 从服务器获取json数据
   * */
  public static String getJsonContent(String path){
    String jsonString="";
    try {
      URL url=new URL(path);
      HttpURLConnection connection=(HttpURLConnection) url.openConnection();
      connection.setConnectTimeout(3000);
      connection.setRequestMethod("GET");
      connection.setDoInput(true);
      int code=connection.getResponseCode();
      if(code==200){
        InputStream inputStream=connection.getInputStream();
        ByteArrayOutputStream outputStream=new ByteArrayOutputStream();
        int len=0;
        byte[] data=new byte[1024];
        while ((len=inputStream.read(data))!=-1) {
          outputStream.write(data, 0, len);
        }
        jsonString=new String(outputStream.toByteArray());
        Log.i(TAG, jsonString);
      }
    } catch (MalformedURLException e) {
      e.printStackTrace();
    } catch (IOException e) {
      e.printStackTrace();
    }
    return jsonString;
  }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Android实现调用系统图库与相机设置头像并保存在本地及服务器

    废话不多说了,直接给大家贴代码了,具体代码如下所述: /** * 1.实现原理:用户打开相册或相机选择相片后,相片经过压缩并设置在控件上,图片在本地sd卡存一份(如果有的话,没有则内部存储,所以还 * 需要判断用户是否挂载了sd卡),然后在服务器上存储一份该图片,当下次再次启动应用时,会默认去sd卡加载该图片,如果本地没有,再会去联网请求 * 2.使用了picasso框架以及自定义BitmapUtils工具类 * 3.记得加上相关权限 * <uses-permission android:nam

  • Android系统自带的VPN服务框架实例详解

    Android系统自带的VPN服务框架 Android从4.0开始(API LEVEL 15),自己带了一个帮助在设备上建立VPN连接的解决方案,且不需要root权限,本文将对其做一个简单的介绍. 一.基本原理 在介绍如何使用这些新增的API之前,先来说说其基本的原理. android设备上,如果已经使用了VpnService框架,建立起了一条从设备到远端的VPN链接,那么数据包在设备上大致经历了如下四个过程的转换: 1)应用程序使用socket,将相应的数据包发送到真实的网络设备上.一般移动设

  • Android中实现OkHttp上传文件到服务器并带进度

    在上一讲中 OkHttp下载文件并带进度条 中,我们知道怎样去下载文件了.那上传文件呢 一.编写服务器端 在上一讲服务器下新建UploadFileServlet,代码如下:然后重启服务器! @WebServlet("/UploadFileServlet") @MultipartConfig public class UploadFileServlet extends HttpServlet { private static final long serialVersionUID = 1

  • android中判断服务或者进程是否存在实例

    1.判断进程是否存在 /** * 判断是否在主进程,这个方法判断进程名或者pid都可以,如果进程名一样那pid肯定也一样 * * @return true:当前进程是主进程 false:当前进程不是主进程 */ public boolean isUIProcess() { ActivityManager am = ((ActivityManager) getSystemService(Context.ACTIVITY_SERVICE)); List<ActivityManager.Running

  • android选择视频文件上传到后台服务器

    本文实例为大家分享了android选择视频文件上传到后台服务器的具体代码,供大家参考,具体内容如下 选择本地视频文件 附上Demo 首先第一步打开打开相册选择视频文件: Intent intent = new Intent(); intent.setType("video/*"); intent.setAction(Intent.ACTION_GET_CONTENT); intent.addCategory(Intent.CATEGORY_OPENABLE); ((Activity)

  • Android判断后台服务是否开启的两种方法实例详解

    Android判断后台服务是否开启的两种方法实例详解 最近项目用到后台上传,就开启了一个服务service. 但是刚开始用这种方法,有些机型不支持:酷派不支持.然后又换了第二种判断方法. // public boolean isServiceWork(Context mContext, String serviceName) { // boolean isWork = false; // ActivityManager myAM = (ActivityManager) mContext // .

  • Android读取服务器图片的三种方法

    Android链接服务器获取图片在此提供三种方法,已通过验证,无误. 方法一: public static Bitmap getImage(String path){ try { HttpURLConnection conn = (HttpURLConnection) new URL(path).openConnection(); conn.setConnectTimeout(5000); conn.setRequestMethod("GET"); System.out.println

  • 详解android与服务端交互的两种方式

    做Android开发的程序员必须知道android客户端应该如何与服务端进行交互,这里主要介绍的是使用json数据进行交互.服务端从数据库查出数据并以json字符串的格式或者map集合的格式返回到客户端,客户端进行解析并输出到手机屏幕上. 此处介绍两种方式:使用Google原生的Gson解析json数据,使用JSONObject解析json数据 一.使用Google原生的Gson解析json数据: 记得在客户端添加gson.jar. 核心代码: 服务端: package com.mfc.ctrl

  • 详解Android提交数据到服务器的两种方式四种方法

    Android应用开发中,会经常要提交数据到服务器和从服务器得到数据,本文主要是给出了利用http协议采用HttpClient方式向服务器提交数据的方法. 代码比较简单,这里不去过多的阐述,直接看代码. /** * @author Dylan * 本类封装了Android中向web服务器提交数据的两种方式四种方法 */ public class SubmitDataByHttpClientAndOrdinaryWay { /** * 使用get请求以普通方式提交数据 * @param map 传

  • 详解Python修复遥感影像条带的两种方式

    GDAL修复Landsat ETM+影像条带 Landsat7 ETM+卫星影像由于卫星传感器故障,导致此后获取的影像出现了条带.如下图所示, 影像中均匀的布满条带. 使用GDAL修复影像条带的代码如下: def gdal_repair(tif_name, out_name, bands): """ tif_name(string): 源影像名 out_name(string): 输出影像名 bands(integer): 影像波段数 """ #

  • 详解python连接telnet和ssh的两种方式

    目录 Telnet 连接方式 ssh连接方式 Telnet 连接方式 #!/usr/bin/env python # coding=utf-8 import time import telnetlib import logging __author__ = 'Evan' save_log_path = 'result.txt' file_mode = 'a+' format_info = '%(asctime)s - %(filename)s[line:%(lineno)d] - %(level

  • 详解pytorch的多GPU训练的两种方式

    目录 方法一:torch.nn.DataParallel 1. 原理 2. 常用的配套代码如下 3. 优缺点 方法二:torch.distributed 1. 代码说明 方法一:torch.nn.DataParallel 1. 原理 如下图所示:小朋友一个人做4份作业,假设1份需要60min,共需要240min. 这里的作业就是pytorch中要处理的data. 与此同时,他也可以先花3min把作业分配给3个同伙,大家一起60min做完.最后他再花3min把作业收起来,一共需要66min. 这个

  • 详解JavaScript发送埋点请求的两种方式

    目录 一.用法 1.动态创建<img> 2.动态创建<script> 二.区别 区别1 区别2 三.选择哪种方式 四.总结 对于统计页面数据这样的情景(俗称埋点),我们常用的方式就是动态创建<img>或<script>,至于原因,一般有以下几点: 1.埋点一般不用关心请求的结果 2.可以实现跨域请求 3.无需使用ajax就能达到发请求的目的 4.都是原生实现,兼容性好 现就两种方式做一下对比和总结: 一.用法 1.动态创建<img> 方式1:通过

  • 详解Spring Boot 中实现定时任务的两种方式

    在 Spring + SpringMVC 环境中,一般来说,要实现定时任务,我们有两中方案,一种是使用 Spring 自带的定时任务处理器 @Scheduled 注解,另一种就是使用第三方框架 Quartz ,Spring Boot 源自 Spring+SpringMVC ,因此天然具备这两个 Spring 中的定时任务实现策略,当然也支持 Quartz,本文我们就来看下 Spring Boot 中两种定时任务的实现方式. @Scheduled 使用 @Scheduled 非常容易,直接创建一个

  • 详解android进行异步更新UI的四种方式

    大家都知道由于性能要求,Android要求只能在UI线程中更新UI,要想在其他线程中更新UI,我大致总结了4种方式,欢迎补充纠正: 使用Handler消息传递机制: 使用AsyncTask异步任务: 使用runOnUiThread(action)方法: 使用Handler的post(Runnabel r)方法: 下面分别使用四种方式来更新一个TextView. 1.使用Handler消息传递机制 package com.example.runonuithreadtest; import andr

  • 详解Android获取所有依赖库的几种方式

    当项目越来越大的时候,依赖的库也越来越多,再加上aar的传递依赖,导致dependency的急速膨胀.我们可以通过如下几种方式,查看项目依赖的所有库(包含直接依赖和间接依赖). 方式一:通过dependencies命令 ./gradlew :app:dependencies 该task会显示如下所示的输出: 输出列表展示了所有configuration下的依赖树,依赖关系明显,层次清晰.如果觉得输出的结果太冗长(通常情况下包含几十个configuration),可以通过指定configurati

  • 详解IntelliJ IDEA创建spark项目的两种方式

    Intellij是进行scala开发的一个非常好用的工具,可以非常轻松查看scala源码,当然用它来开发Java也是很爽的,之前一直在用scala ide和eclipse,现在换成intellij简直好用到飞起,但是有些人不知道怎么用intellij去创建一个spark项目,这里介绍两种 1.选择File->new Project->Java->Scala,这里scala版本是2.11.8 2 .之后一路点击next,直到finish,创建完的项目见下图,这时候已经可以创建scala文件

随机推荐