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

android客户端传递复杂参数给webservice

2014-08-05 09:21 344 查看
1.Webservice开发

Webservice由wcf开发完成,我不懂,大概说一下会用到哪些。就在下图中,解释一下下图,是服务器自动生成的,通过URL(http://192.168.13.95:8086/UIServices)在浏览器中打开是这样的,程序中用到的就是URL和namespace,以及方法名,图1的namespace1里面定义的是方法名,namespace2里面定义的是各种数据结构在图4中(特别注意两个命名空间)。图1和图2是一个文件,属于namespace1,图3和图4是一个文件属于namespace2.




图1




图2




图3










图4

图4中的数据结构在c#中是下面这样定义的,生成wsdl文件后就如图4一样




2.android调用

a) 首先要下载添加jar包:ksoap2-android-assembly-2.6.5-jar-with-dependencies.jar,需要在网上下载现在应该到3.0的版本了。

b) 在android中,直接传递给ws参数时支持四种基本类型:int、String、boolean、long,传递基本类型时无须序列化,传递数组是需要继承vector(后面会讲到),而且需要序列化(序列化具体我也不知道,有兴趣的可以研究下)。

c) 调用ws的方法时需要传递相同类型的参数,基本类型就不多说了,还有一种是传递json串,比较简单,这里说一下复杂类型。比如上面的Caption方法,它的参数(图上没有标明)就是CaptionInfo类的对象,那么在android中如何定义一个同类型的呢,首先要定义Caption类,要实现KvmSerializable,是为了序列化,这些参数要和c#中的一样,set和get方法可以不要。

d) 注意那几个继承下来的方法:里面case的顺序要和图4中的各属性顺序一样,case 0:必须是BlackColor,依次类推。getPropertyInfo中的arg2.namespace = 图1中的namespace2,也就是图3中的namespace这个很重要

e) 构造列表,android不支持List,所以要用vector代替,而且必须序列化,数组也是这样定义的

f) 封装成CaptionInfo类,每层都要序列化,此时参数(下面有代码)算是构造好了,然后是调用

g) 下面是调用的主要代码,以及类的写法

<pre name="code" class="java">String nameSpaceString = "http://tempuri.org/";//图1中的namespace1
			String methodName = "Cantion";
			String urlString = "http://192.168.13.95:8086/UIServices";//url
	String soapAction = "http://tempuri.org/IUI/Cantion";//图2中的soapAction
CaptionInfo captionInfo = new CaptionInfo();
SoapObject requests = new SoapObject(nameSpaceString, methodName);
	requests.addProperty("message", captionInfo );//message 是服务器中方法的参数			//名,最好保持一致
SoapSerializationEnvelope envelopes =
 	new SoapSerializationEnvelope(SoapEnvelope.VER11);
envelopes.addMapping(CaptionInfo.NAMESPACE, "Caption", Caption.class);
envelopes.addMapping(CaptionInfo.NAMESPACE, 
"ArrayOfCaption", ArrayOfCaption.class);
envelopes.addMapping(CaptionInfo.NAMESPACE, "CaptionInfo", 					CaptionInfo.class);
//envelopes.addMapping(...);必须加
envelopes.bodyOut = requests;
envelopes.dotNet = true;
envelopes.setOutputSoapObject(requests);
HttpTransportSE hts = new HttpTransportSE(urlString);
	try {
		hts.call(soapAction, envelopes);
		if(envelopes.getResponse() != null)
		{
//解析的时候没找到好的解析方法,只能一步一步按照字段解析
//可以单步调试,看返回值是什么
			SoapObject returnObjects = (SoapObject) envelopes.bodyIn;
			//SoapObject CaptionList =
 (SoapObject)returnObjects.getProperty(0);
			
		}
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (XmlPullParserException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}


CaptionInfo的定义:


<pre name="code" class="java">


class Caption implements KvmSerializable{
	public String BackColor;
	public String CaptionName;
	public String Content;
	public String Font;
	public String FontColor;
	public String FontOpacity;
	public String OutlineColor;
	public String getCaptionName() {
		return CaptionName;
	}

	public void setCaptionName(String captionName) {
		CaptionName = captionName;
	}

	public String getContent() {
		return Content;
	}

	public void setContent(String content) {
		Content = content;
	}

	public String getFont() {
		return Font;
	}

	public void setFont(String font) {
		Font = font;
	}

	public String getFontColor() {
		return FontColor;
	}
	public void setFontColor(String fontColor) {
		FontColor = fontColor;
	}
	public String getBackColor() {
		return BackColor;
	}
	public void setBackColor(String backColor) {
		BackColor = backColor;
	}
	public String getFontOpacity() {
		return FontOpacity;
	}
	public void setFontOpacity(String fontOpacity) {
		FontOpacity = fontOpacity;
	}
	public String getOutlineColor() {
		return OutlineColor;
	}
	public void setOutlineColor(String outlineColor) {
		OutlineColor = outlineColor;
	}
	@Override
	public Object getProperty(int arg0) {
		// TODO Auto-generated method stub
		switch (arg0) {
		case 0:
			return BackColor;
		case 1:
			return CaptionName;
		case 2:
			return Content;
		case 3:
			return Font;
		case 4:
			return FontColor;
		case 5:
			return FontOpacity;
		case 6:
			return OutlineColor;
		default:
			return null;
		}
	}
	@Override
	public int getPropertyCount() {
		// TODO Auto-generated method stub
		return 7;//属性的个数
	}
	@Override
	public void getPropertyInfo(int arg0, Hashtable arg1, PropertyInfo arg2) {
		// TODO Auto-generated method stub
		arg2.namespace = "http://schemas.datacontract.org/2004/07/RecordUIObject"; 
		switch (arg0) {
		case 0:
			arg2.type = PropertyInfo.STRING_CLASS;
			arg2.name = "BackColor";
			break;
		case 1:
			arg2.type = PropertyInfo.STRING_CLASS;
			arg2.name = "CaptionName";
			break;
		case 2:
			arg2.type = PropertyInfo.STRING_CLASS;
			arg2.name = "Content";
			break;
		case 3:
			arg2.type = PropertyInfo.STRING_CLASS;
			arg2.name = "Font";
			break;
		case 4:
			arg2.type = PropertyInfo.STRING_CLASS;
			arg2.name = "FontColor";
			break;
		case 5:
			arg2.type = PropertyInfo.STRING_CLASS;
			arg2.name = "FontOpacity";
			break;
		case 6:
			arg2.type = PropertyInfo.STRING_CLASS;
			arg2.name = "OutlineColor";
			break;

		default:
			break;
		}
	}

	@Override
	public void setProperty(int arg0, Object arg1) {
		// TODO Auto-generated method stub
		switch (arg0) {
		case 0:
			BackColor = arg1.toString();
			break;
		case 1:
			CaptionName = arg1.toString();
			break;
		case 2:
			Content = arg1.toString();
			break;
		case 3:
			Font = arg1.toString();
			break;
		case 4:
			FontColor = arg1.toString();
			break;
		case 5:
			FontOpacity = arg1.toString();
			break;
		case 6:
			OutlineColor = arg1.toString();
			break;
		default:
			break;
		}
	}
}

class ArrayOfCaption extends Vector<Caption> implements KvmSerializable
{

	@Override
	public Object getProperty(int arg0) {
		// TODO Auto-generated method stub
		return this.get(arg0);
	}

	@Override
	public int getPropertyCount() {
		// TODO Auto-generated method stub
		return this.size();
	}

	@Override
	public void getPropertyInfo(int arg0, Hashtable arg1, PropertyInfo arg2) {
		// TODO Auto-generated method stub
		arg2.namespace = "http://schemas.datacontract.org/2004/07/RecordUIObject";
		arg2.name = "Caption";
		arg2.type = new Caption().getClass();
	}

	@Override
	public void setProperty(int arg0, Object arg1) {
		// TODO Auto-generated method stub
		this.add((Caption)arg1);
	}
}

public class CaptionInfo implements BaseObject{
	
	public ArrayOfCaption CaptionList = new ArrayOfCaption();

	public ArrayOfCaption getArrayOfCaption() {
		return CaptionList;
	}

	public void setArrayOfCaption(ArrayOfCaption arrayOfCaption) {
		this.CaptionList = arrayOfCaption;
	}

	@Override
	public Object getProperty(int arg0) {
		// TODO Auto-generated method stub
		return CaptionList;
	}

	@Override
	public int getPropertyCount() {
		// TODO Auto-generated method stub
		return 1;
	}
	@Override
	public void getPropertyInfo(int arg0, Hashtable arg1, PropertyInfo arg2) {
		// TODO Auto-generated method stub
		arg2.namespace = "http://schemas.datacontract.org/2004/07/RecordUIObject";
		arg2.type = PropertyInfo.VECTOR_CLASS;
		arg2.name = "CaptionList";
	}

	@Override
	public void setProperty(int arg0, Object arg1) {
		// TODO Auto-generated method stub
		CaptionList = (ArrayOfCaption)arg1;
	}
}



                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: