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