Android使用Json和ksoap2调用WebService(WCF)

自我介绍:本人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; }
    }
}

添加WCF服务“Service1.svc”后我们可以看到应用程序中多了接口文件“IService1.cs”和服务文件“Service1.svc”。
修改接口文件“IService1.cs”代码如下

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);
    }
}


修改服务文件“Service1.svc”代码如下(记得代码中引用Newtonsoft.Json.dll)

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;
        }
    }
}


2)将WCF发布到IIS

如我的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);
}

实现接口类“SoapService”代码如下,主要是实现调用WCF

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;
	}
}


然后在MainActivity.java中调用类,重点提醒:MainActivity中调用类“SoapService”实现调用WCF时必须在子线程中实现,不然将会报主线程异常,MainActivity.java具体代码如下
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" />

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值