android通过C#的webservice与服务端进行数据通信(sqlserver)
2016-04-15 16:23
489 查看
这两天由于工作需要,学习了下android通过C#的webservice与服务端进行数据通信(sqlserver)。中间遇到几个问题,总结下,以备后期使用时注意。
Android端调用webservice的代码:
/**
* 上传设备状态信息信息
*
* @param data
打包好的数据
* @return 成功与否的相关字符串
*/
publicstatic StringuploadLocation(String data) {
METHOD_NAME =
"UploadLocation";
try {
SoapObject soapObject = new
SoapObject(NAMESPACE,
METHOD_NAME);
PropertyInfo propertyInfo = new
PropertyInfo();
propertyInfo.setName("LocationInfo");
propertyInfo.setValue(data);
soapObject.addProperty(propertyInfo);
SoapSerializationEnvelopeenvelope = new
SoapSerializationEnvelope(
SoapEnvelope.VER11);
envelope.dotNet =
true;
envelope.setOutputSoapObject(soapObject);
HttpTransportSE httpTranstation =new
HttpTransportSE(URL);
httpTranstation.debug
= true;
httpTranstation.call(NAMESPACE
+ METHOD_NAME, envelope);
Object result = (Object)envelope.getResponse().toString();
if (result !=
null) {
Log.i("WebserviceControlClass", result.toString());
return result.toString();
}
return "返回数据为空";
} catch (Exception e) {
e.printStackTrace();
Log.i("WebserviceControlClass",
"设备信息上传出现异常"
+ e.toString());
return "出现异常";
}
}
需要注意的地方:
1. propertyInfo.setName("LocationInfo");参数要与webservice方法中参数保持一致,否则获取不到数据。
2. envelope.dotNet
= true;我用的是dotwebservice
的协议,并且用的rpc方式所以,这里要用true.
3. httpTranstation.debug
= true;需要用调试模式,所以为true
因为与服务器之间进行通信,是一个耗时的操作,所最后不要再主线程中直接写访问代码。应该通过异步的方式,请求数据。
然后配合handler实现数据的收发。
因为我需要将一个对象传递到服务端,android调用webservice传输复杂对象,该怎么做呢?
具体的实现方式如下。
首先是android具体操作代码,这里通过handler将locationData传递给异步类,进行数据上传。
需要注意的是,传递的对象,android和服务端需要保持一致,在android将数据打包成JSONObject,在服务端在解析出来,服务端代码在下面贴出。
接下来是服务端sebservice的具体方法代码,其中这个db_table_device_state
数据类要和android端的DbDeviceStateClass数据类保持一致,才能通过
device_state=(db_table_device_state)jsonSerializer.Deserialize(newJsonTextReader(strReader),typeof(db_table_device_state));将JSONObject数据解析出来。
好了,整体流程代码和需要注意的问题都在这里了。吼吼!!
Android端调用webservice的代码:
/**
* 上传设备状态信息信息
*
* @param data
打包好的数据
* @return 成功与否的相关字符串
*/
publicstatic StringuploadLocation(String data) {
METHOD_NAME =
"UploadLocation";
try {
SoapObject soapObject = new
SoapObject(NAMESPACE,
METHOD_NAME);
PropertyInfo propertyInfo = new
PropertyInfo();
propertyInfo.setName("LocationInfo");
propertyInfo.setValue(data);
soapObject.addProperty(propertyInfo);
SoapSerializationEnvelopeenvelope = new
SoapSerializationEnvelope(
SoapEnvelope.VER11);
envelope.dotNet =
true;
envelope.setOutputSoapObject(soapObject);
HttpTransportSE httpTranstation =new
HttpTransportSE(URL);
httpTranstation.debug
= true;
httpTranstation.call(NAMESPACE
+ METHOD_NAME, envelope);
Object result = (Object)envelope.getResponse().toString();
if (result !=
null) {
Log.i("WebserviceControlClass", result.toString());
return result.toString();
}
return "返回数据为空";
} catch (Exception e) {
e.printStackTrace();
Log.i("WebserviceControlClass",
"设备信息上传出现异常"
+ e.toString());
return "出现异常";
}
}
需要注意的地方:
1. propertyInfo.setName("LocationInfo");参数要与webservice方法中参数保持一致,否则获取不到数据。
2. envelope.dotNet
= true;我用的是dotwebservice
的协议,并且用的rpc方式所以,这里要用true.
3. httpTranstation.debug
= true;需要用调试模式,所以为true
因为与服务器之间进行通信,是一个耗时的操作,所最后不要再主线程中直接写访问代码。应该通过异步的方式,请求数据。
importandroid.os.AsyncTask; /** * Created by ZHao on 2016/4/15. */ public class WebServiceTask extends AsyncTask<String, Integer, String> { public WebServiceTask() { } @Override protected void onPreExecute() { } @Override protected String doInBackground(String... params) { return WebserviceControlClass.uploadLocation(params[0]);//这里返回webServices请求的值。 } @Override protected void onProgressUpdate(Integer... progress) { } @Override protected void onPostExecute(String result) { } }
然后配合handler实现数据的收发。
/** * 处理设备状态信息 上传和回掉结果 */ public Handler handler = new Handler() { @Override public void handleMessage(Message msg) { if (msg.what == 0) { WebServiceTask task = new WebServiceTask(); String result = ""; try { task.execute((String) msg.obj); //设置请求参数 result = task.get(5000, TimeUnit.MILLISECONDS); //获取返回值,设置超时时间。 } catch (InterruptedException e) { e.printStackTrace(); result = "出现异常InterruptedException"; } catch (ExecutionException e) { e.printStackTrace(); result = "出现异常ExecutionException"; } catch (TimeoutException e) { e.printStackTrace(); result = "出现异常TimeoutException"; } catch (Exception e) { result = "出现异常 Exception"; } LogTools.i(TAG, result); } } };
因为我需要将一个对象传递到服务端,android调用webservice传输复杂对象,该怎么做呢?
具体的实现方式如下。
首先是android具体操作代码,这里通过handler将locationData传递给异步类,进行数据上传。
dbDeviceStateClass = new DbDeviceStateClass(); dbDeviceStateClass.setDevice_id(CommonUtil.getDeviceId(this));//设备id LogTools.i(TAG, CommonUtil.getDeviceId(this)); dbDeviceStateClass.setDevice_state_current_lat(String.valueOf(geoLat));//精度 dbDeviceStateClass.setDevice_state_current_lon(String.valueOf(geoLng));//纬度 dbDeviceStateClass.setDevice_city(location.getCity());//所在城市 dbDeviceStateClass.setDevice_province(location.getProvince());//所在省 locationData = ConvertForJsonModelControl.ConvertToJsonForDeviceState(dbDeviceStateClass); Message msg = handler.obtainMessage(); msg.what = 0; msg.obj = locationData; handler.sendMessageDelayed(msg, 10);
需要注意的是,传递的对象,android和服务端需要保持一致,在android将数据打包成JSONObject,在服务端在解析出来,服务端代码在下面贴出。
** * 将设备状态信息实体类转换为json对象 * @param dbDeviceStateClass * @return */ public static String ConvertToJsonForDeviceState(DbDeviceStateClass dbDeviceStateClass) { String jsonStr = ""; JSONObject modelJsonObject = new JSONObject(); try { modelJsonObject.put("device_state_id", 0); modelJsonObject.put("device_id", dbDeviceStateClass.getDevice_id()); modelJsonObject.put("user_name", dbDeviceStateClass.getUser_name()); modelJsonObject.put("device_city", dbDeviceStateClass.getDevice_city()); modelJsonObject.put("device_province", dbDeviceStateClass.getDevice_province()); modelJsonObject.put("device_location", dbDeviceStateClass.getDevice_location()); modelJsonObject.put("device_state_current_speed", dbDeviceStateClass.getDevice_state_current_speed()); modelJsonObject.put("device_state_update_time", dbDeviceStateClass.getDevice_state_update_time()); modelJsonObject.put("device_state_connect_net", dbDeviceStateClass.getDevice_state_connect_net()); modelJsonObject.put("device_state_current_lat", dbDeviceStateClass.getDevice_state_current_lat()); modelJsonObject.put("device_state_current_lon", dbDeviceStateClass.getDevice_state_current_lon()); jsonStr = modelJsonObject.toString(); } catch (JSONException e) { e.printStackTrace(); } return jsonStr; }
接下来是服务端sebservice的具体方法代码,其中这个db_table_device_state
数据类要和android端的DbDeviceStateClass数据类保持一致,才能通过
device_state=(db_table_device_state)jsonSerializer.Deserialize(newJsonTextReader(strReader),typeof(db_table_device_state));将JSONObject数据解析出来。
/// <summary> /// 保存设备状态到数据库 /// </summary> /// <param name="LocationInfo"></param> /// <returns></returns> [WebMethod] public string UploadLocation(string LocationInfo) { string strJson = ""; db_table_device_state device_state = null; try { using (var db = new hudProjecterDBEntities()) { JsonSerializer jsonSerializer = new JsonSerializer(); StringReader strReader = new StringReader(LocationInfo); device_state = (db_table_device_state)jsonSerializer.Deserialize(new JsonTextReader(strReader), typeof(db_table_device_state)); if (device_state != null) { var mdevice = db.db_table_device.FirstOrDefault(p => p.device_id == device_state.device_id); strJson = "mdevice:" + mdevice; if (mdevice != null) { db_table_device_state mdevicestate = new db_table_device_state(); mdevicestate.device_state_current_lat = device_state.device_state_current_lat; mdevicestate.device_state_current_lon = device_state.device_state_current_lon; mdevicestate.device_state_connect_net = device_state.device_state_connect_net; mdevicestate.device_state_update_time = DateTime.Now; mdevicestate.device_state_current_speed = device_state.device_state_current_speed; db.db_table_device_state.Add(mdevicestate); db.SaveChanges(); strJson = "[{\"Code\":\"200\",\"Message\":\"操作成功!\"}]"; } } } } catch (Exception ex) { strJson = "[{\"Code\":\"500\",\"Message\":\"服务器出错!\"}]"; } return strJson; }
好了,整体流程代码和需要注意的问题都在这里了。吼吼!!
相关文章推荐
- Oracle 数组赋值
- 判断数据库和磁盘中文件是否一致
- mysql 同步redis
- mysql 安装脚本
- /usr/bin/ld: cannot find -lmysqlclient解决方法
- MYSQL中group_concat有长度限制!默认1024
- sql server 分隔字符串返回表
- MySQL实时统计脚本--计算QPS,TPS和线程连接数等
- 尝试一下sql server2016里面的json功能
- 数据库同步为什么不建议使用dblink方式
- [转] JAVA读取excel数据(插入oracle数据库)
- Oracle中给用户授予debug权限
- SQL-SELECT-检索数据(一)
- 【数据库】创建视图约束
- sql语法实战50题
- mysql 利用触发器(Trigger)让代码更简单
- 【毕业生推荐系统】(2) 需求与数据库设计
- 如何让不支持Emoji表情符的数据库存取Emoji表情
- Linux下启动Oracle
- Memcached 及 Redis 架构分析和比较