自我介绍:本人C#程序猿,有一颗想学Android的心,在做到将Android Sqlite中的数据上传到远程服务器,自然而然的想到用C# 的WCF将数据插入到SQL,以下代码花了本猿猴1个星期的时候,所以想了一下觉得还是总结出来,希望对你有用。
准备工作
Json的下载地址如下
http://download.csdn.net/detail/czh4869623/4742196
Ksoap2的下载地址如下
http://download.csdn.net/detail/czh4869623/6601997
现在让我们来看一下代码
1)首先创建WCF
新建ASP.NET Web空Web应用程序,在应用程序中添加实体类“Person”和WCF服务“Service1.svc”。
实体类“Person”的代码如下(注意字段要和Android端的实体类字段保持一致)
using System; using System.Collections.Generic; using System.Linq; using System.Web; namespace WebApplication197 { public class Person { public int PID { get; set; } public string PName { get; set; } public string PAddress { get; set; } public decimal PAccount { get; set; } public string PDate { get; set; } } }
using System; using System.Collections.Generic; using System.Linq; using System.Runtime.Serialization; using System.ServiceModel; using System.Text; namespace WebApplication197 { // NOTE: You can use the "Rename" command on the "Refactor" menu to change the interface name "IService1" in both code and config file together. [ServiceContract(Namespace = "http://chad.cao")]//在Android调用WCF时需要Namespace public interface IService1 { [OperationContract] void DoWork(); [OperationContract] Person GetPerson(string _jsonString); [OperationContract] List<Person> GetPersons(string _jsonString); } }
using System; using System.Collections.Generic; using System.Linq; using System.Runtime.Serialization; using System.ServiceModel; using System.Text; using Newtonsoft.Json; using System.IO; namespace WebApplication197 { // NOTE: You can use the "Rename" command on the "Refactor" menu to change the class name "Service1" in code, svc and config file together. public class Service1 : IService1 { public void DoWork() { } public Person GetPerson(string _jsonString) { //读取从Android端传来json将其转化为实体类Person JsonSerializer jsonSerializer = new JsonSerializer(); StringReader reader = new StringReader(_jsonString); Person item = (Person)jsonSerializer.Deserialize(new JsonTextReader(reader), typeof(Person)); //修改实体类并回传给Android端 Person person = new Person(); person.PID = item.PID + 1; person.PName = item.PName + "1"; person.PAddress = item.PAddress + "1"; person.PAccount = item.PAccount + 1; person.PDate = item.PDate + "1"; return person; } public List<Person> GetPersons(string _jsonString) { //读取从Android端传来json将其转化为List<Person> JsonSerializer jsonSerializer = new JsonSerializer(); StringReader reader = new StringReader(_jsonString); List<Person> items = (List<Person>)jsonSerializer.Deserialize(new JsonTextReader(reader), typeof(List<Person>)); //修改List<Person>并回传给Android端 List<Person> persons = new List<Person>(); if (items.Count > 0) { foreach (Person item in items) { Person person = new Person(); person.PID = item.PID + 1; person.PName = item.PName + "1"; person.PAddress = item.PAddress + "1"; person.PAccount = item.PAccount + 1; person.PDate = item.PDate + "1"; persons.Add(person); } } return persons; } } }
如我的WCF发布URL是http://172.16.18.74/Service1.svc
3)Android调用WCF
上文中我们已经下载了ksoap2,下载后如何调用,这个问题对Android高手是多余的,但是很多新手应该还是需要讲解一下的
首先我们讲ksoap2粘贴到项目的“libs”目录下,然后点击Eclipse的"Project"下的“Properties”选项卡,接下来选择左边的“Java Build Path”后在右边选择“Libraries”选项卡,单机“Add JARs...”按钮通过浏览到当前项目下的"libs"目录将ksoap2添加。
接下来我们打开Eclipse新建Android Application Project,
首先创建实体类“Person”代码如下
package com.example.androidjsonwcf; import java.util.List; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; public class Person { public Person(){} public Person(Integer _id, String _name, String _address, Double _account, String _date){ PID=_id; PName=_name; PAddress=_address; PAccount=_account; PDate=_date; } //要和WebService中字段名称一致 private Integer PID; private String PName; private String PAddress; private Double PAccount; private String PDate; //将List转化成json以便于在网络中传输 public static String ConvertToJson(List<Person> items){ String jsonString=""; JSONArray jsonArray=new JSONArray(); try { if(items.size()>0){ for (Person item : items) { JSONObject jsonObject=new JSONObject(); jsonObject.put("PID", item.PID); jsonObject.put("PName", item.PName); jsonObject.put("PAddress", item.PAddress); jsonObject.put("PAccount", item.PAccount); jsonObject.put("PDate", item.PDate); jsonArray.put(jsonObject); } jsonString=jsonArray.toString(); } } catch (JSONException e) { e.printStackTrace(); } return jsonString; } //将实体对象转化成json以便于在网络中传输 public static String ConvertToJson(Person item){ String jsonString=""; JSONObject jsonObject=new JSONObject(); try { jsonObject.put("PID", item.PID); jsonObject.put("PName", item.PName); jsonObject.put("PAddress", item.PAddress); jsonObject.put("PAccount", item.PAccount); jsonObject.put("PDate", item.PDate); jsonString=jsonObject.toString(); } catch (JSONException e) { e.printStackTrace(); } return jsonString; } public Integer getPID() { return PID; } public void setPID(Integer pID) { PID = pID; } public String getPName() { return PName; } public void setPName(String pName) { PName = pName; } public String getPAddress() { return PAddress; } public void setPAddress(String pAddress) { PAddress = pAddress; } public Double getPAccount() { return PAccount; } public void setPAccount(Double pAccount) { PAccount = pAccount; } public String getPDate() { return PDate; } public void setPDate(String pDate) { PDate = pDate; } }
然后创建接口“ISoapService”和实现接口类“SoapService”
接口“ISoapService”代码如下
package com.example.androidjsonwcf; import java.util.List; public interface ISoapService { List<Person> getPersonsResult(String _methodName, List<Person> _persons); Person getPersonResult(String _methodName, Person _person); }
package com.example.androidjsonwcf; import java.util.ArrayList; import java.util.List; import org.ksoap2.SoapEnvelope; import org.ksoap2.serialization.SoapObject; import org.ksoap2.serialization.SoapSerializationEnvelope; import org.ksoap2.transport.HttpTransportSE; public class SoapService implements ISoapService{ private String NAMESPACE="http://chad.cao"; private String URL="http://172.16.18.74/Service1.svc"; private String SOAPACTION="http://chad.cao/IService1/"; public List<Person> getPersonsResult(String _methodName, List<Person> _persons){ List<Person> persons=new ArrayList<Person>(); SOAPACTION+=_methodName; //将List<Person>转化成json String jsonString=Person.ConvertToJson(_persons); SoapObject soapObject=new SoapObject(NAMESPACE, _methodName); soapObject.addProperty("_jsonString", jsonString);//传参,记住参数名必须和WCF方法中的参数名一致 SoapSerializationEnvelope envelope=new SoapSerializationEnvelope(SoapEnvelope.VER11); envelope.bodyOut=soapObject; envelope.dotNet=true; envelope.setOutputSoapObject(soapObject); HttpTransportSE transportSE=new HttpTransportSE(URL); transportSE.debug=true;//使用调式功能 try { transportSE.call(SOAPACTION, envelope); if(envelope.getResponse()!=null){ /* GetPersonsResponse{ * GetPersonsResult=anyType{ * Person=anyType{PAccount=12; PAddress=zhejiang1; PDate=2014-01-21 06:57:261; PID=2; PName=chad.cao1; }; * Person=anyType{PAccount=13; PAddress=sichuan1; PDate=2014-01-21 06:57:261; PID=3; PName=catherine.yu1; }; * }; }*/ SoapObject result=(SoapObject)envelope.bodyIn; SoapObject result1=(SoapObject)result.getProperty(0); //获取从WCF回传的List<Person> if(result1.getPropertyCount()>0){ for(int i=0; i<result1.getPropertyCount();i++){ SoapObject personSoapObject=(SoapObject)result1.getProperty(i); Person person=new Person(); person.setPID(Integer.valueOf(personSoapObject.getProperty("PID").toString())); person.setPName(personSoapObject.getProperty("PName").toString()); person.setPAddress(personSoapObject.getProperty("PAddress").toString()); person.setPAccount(Double.parseDouble(personSoapObject.getProperty("PAccount").toString())); person.setPDate(personSoapObject.getProperty("PDate").toString()); persons.add(person); } } } } catch (Exception e) { e.printStackTrace(); } return persons; } public Person getPersonResult(String _methodName, Person _person){ Person person=new Person(); SOAPACTION+=_methodName; //将实例化的尸体类Person转化成json String jsonString=Person.ConvertToJson(_person); //将json作为参数传递给WCF SoapObject soapObject=new SoapObject(NAMESPACE, _methodName); soapObject.addProperty("_jsonString", jsonString);//传参,记住参数名必须和WCF方法中的参数名一致 SoapSerializationEnvelope envelope=new SoapSerializationEnvelope(SoapEnvelope.VER11); envelope.bodyOut=soapObject; envelope.dotNet=true; envelope.setOutputSoapObject(soapObject); HttpTransportSE transportSE=new HttpTransportSE(URL); transportSE.debug=true;//使用调式功能 try { transportSE.call(SOAPACTION, envelope); if(envelope.getResponse()!=null){ /* GetPersonResponse{ * etPersonResult=anyType{PAccount=12; PAddress=zhejiang1; PDate=2014-01-21 06:58:421; PID=2; PName=chad.cao1; }; * }*/ SoapObject result=(SoapObject)envelope.bodyIn; if(result.getPropertyCount()==1){ //获取从WCF回传的Person SoapObject personSoapObject=(SoapObject)result.getProperty(0); person.setPID(Integer.valueOf(personSoapObject.getProperty("PID").toString())); person.setPName(personSoapObject.getProperty("PName").toString()); person.setPAddress(personSoapObject.getProperty("PAddress").toString()); person.setPAccount(Double.parseDouble(personSoapObject.getProperty("PAccount").toString())); person.setPDate(personSoapObject.getProperty("PDate").toString()); } } } catch (Exception e) { e.printStackTrace(); } return person; } }
package com.example.androidjsonwcf; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.List; import android.os.Bundle; import android.app.Activity; import android.view.Menu; public class MainActivity extends Activity { private Runnable myRunnable=new Runnable() { @Override public void run() { SoapService soapService=new SoapService(); Date currentDate=new Date(System.currentTimeMillis()); SimpleDateFormat simpleDateFormat=new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); String dateString=simpleDateFormat.format(currentDate); //Person /*Person person=new Person(1, "chad.cao", "zhejiang", 11.0, dateString); Person resultPerson=soapService.getPersonResult("GetPerson", person);*/ //List<Person> List<Person> persons=new ArrayList<Person>(); persons.add(new Person(1, "chad.cao", "zhejiang", 11.0, dateString)); persons.add(new Person(2, "catherine.yu", "sichuan", 12.0, dateString)); List<Person> resultPersons=soapService.getPersonsResult("GetPersons", persons); String testString="OK"; } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); new Thread(myRunnable).start(); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } }
最后记得修改AndroidManifest.xml文件添加权限
<uses-permission android:name="android.permission.INTERNET" />