您的位置:首页 > 移动开发 > Android开发

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

2014-01-21 16:06 501 查看
自我介绍:本人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" />
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息