在VB下调用Web Service
下面我在VB环境下来调用下这个Web Service笔者使用的是Visual Basic 要在VB下调用Web Service需要先安装Microsoft SOAP toolkit
新建一个VB工程然后把Microsoft Soap Type Library引用进来如下图
新建一个form添加一个按钮command在form源代码窗口中整个拷贝如下代码
Dim soap As MSSOAPLibSoapClient
Private Sub Command_Click()
MsgBox soapsayHello()
MsgBox soapwelcome(老Z)
If Err <> Then
MsgBox Web Service调用失败 + ErrDescription
End If
End Sub
Private Sub Form_Load()
Set soap = New MSSOAPLibSoapClient
On Error Resume Next
Call soapmssoapinit(//localhost:/WSDemo/HelloWorldWS?WSDL)
If Err <> Then
MsgBox 初始化SOAP失败 + ErrDescription
End If
End Sub
然后运行工程点击窗口上的按钮就开始调用前面部署的Web Service(确保Weblogic Server在运行中)成功的话会得到如下图的两个MessageBox
educitycn/img_///jpg >educitycn/img_///jpg >
四使用非内建数据类型
前面例子中的Web Service方法中使用的参数和返回值都是String类似Stringint等数据类型是属于Weblogic web service所支持的内建类型关于Weblogic web service所支持的内建数据类型请参见#
所支持的XML非内建类型请参见
#
所支持的Java非内建数据类型请参见
#
WebLogic Server能够对内建数据类型进行XML与Java表示之间的转换但是如果你在web service操作中使用了非内建数据类型那么你必须提供以下信息以确保weblogic server能够正确地进行转换
用于处理数据的Java表示与XML之间的转换的序列化类
包含了数据类型Java表示的Java类
数据类型的XML Schema表示
webservicesxml部署描述文件中的数据类型映射信息
Weblogic Server中带有servicegen和autotype Atn任务这两个任务通过对web service的无状态EJB或者Java类后端组件的内省从而自动生成上述部件上述Ant任务能够处理许多非内建数据类型所以大多数的开发者并不需要手工生成上述的部件
有时你可能也需要手工去创建非内建数据类型部件因为你的数据类型可能很复杂以致Ant任务不能正确生成前述部件你也可能想要自己控制数据在XML和Java表示之间的转换过程而不依赖Weblogic Server所使用的缺省转换程序
本节将演示在Weblogic web service中如何处理非内建(自定义)的数据类型
我们先编写一个数值Bean类UserInfo如下
package comwnetwwsdemo;
import javautil*;
public class UserInfo{
private Integer userid;
private String username;
private String sex;
private Date birthday;
private int level;
private double salary;
private telcodes list;
public UserInfo(){}
public Integer getUserid(){
return userid;
}
public void setUserid(Integer userid){
thisuserid = userid;
}
public String getUsername(){
return username;
}
public void setUsername(String username){
thisusername = username;
}
public String getSex(){
return sex;
}
public void setSex(String sex){
thissex = sex;
}
public Date getBirthday(){
return birthday;
}
public void setBirthday(Date birthday){
thisbirthday = birthday;
}
public int getLevel(){
return level;
}
public void setLevel(int level){
thislevel = level;
}
public double getSalary(){
return salary;
}
public void setSalary(double salary){
thissalary = salary;
}
public List getTelcodes(){
return telcodes;
}
public void setTelcodes (List telcodes){
this telcodes = telcodes;
}
}
在前文中的后端组件类HelloWorldWSjava中增加一个方法
public UserInfo getUserInfo(Integer userid){
UserInfo userinfo = new UserInfo();
userinfosetUserid(userid);
userinfosetUsername(李泽林);
userinfosetSex(男);
userinfosetBirthday(new Date());
userinfosetLevel();
userinfosetSalary();
List telcodes = new ArrayList();
telcodesadd();
telcodesadd();
userinfosetTelcodes (telcodes);
return userinfo;
}
在这个方法里返回值是UserInfo这是我们前面定义的数值Bean由于这是非内建类型而且也不属于受支持的非内建类型所以需要我们必须自己来处理XML和UserInfo Java表示数据类型之间的转换
在本文的例子中我们使用Weblogic Server的autotype任务来做这件事情我们先在build目录建一个autotype目录然后在前文中ant完整脚本中的compile任务之后增加下述脚本
<target name=gentypeinfo>
<autotype javatypes=comwnetwwsdemoUserInfo
targetNamespace=
packageName=comwnetwwsdemo
destDir=/autotype
keepGenerated=true>
<classpath refid=classpath/>
</autotype>
<copy todir=/classes>
<fileset dir=/autotype>
<include name=**/*class/>
</fileset>
</copy>
</target>
autotype Ant任务有几个常用属性下面简要说明下
javatypes需要进行类型转换的非内建(自定义)数据类型java类注意取值是全限定类名不需要带上java或者class扩展名如果存在多个这样的数据类型类用逗号隔开
targetNamespace在对数据类型映射到XML的时候使用的命名空间
packageName生成的序列化相关类的封装包
destDir生成的序列化相关类存放的目录
keepGenerated是否保留中间java源文件取值为true或者false
关于autotype任务的详细信息请参考
#
上述ant任务成功运行后就会生成build/autotype/目录下生成typesxml文件以及按包封装的数据转换类的源文件和class文件
由于增加了自定义数据类型所以我们还得更新sourcewsdd任务脚本以下是增加了自定义数据类型处理后的sourcewsdd任务脚本
<target name=genwsdd>
<sourcewsdd javaSource=/com/wnetw/ws/demo/HelloWorldWSjava
typesInfo=/autotype/typesxml
ddFile=/wsddfiles/webservicesxml
wsdlFile=/wsddfiles/HelloWorldWSwsdl
serviceURI=/HelloWorldWS>
<classpath refid=classpath/>
</sourcewsdd>
</target>
跟以前的脚本相比增加了typesInfo属性来指定自定义数据类型的XML描述文件
增加了对自定义数据类型支持后的完整脚本请参考本文代码下载文件
按照第一节所述方法运行ant脚本build_wls_allxml后再部署buildpplications目录下的HelloWorldWSear就可以按照以前说的方法进行测试了
这一次在Weblogic Server自动生成的web service测试主页
//localhost:/WSDemo/HelloWorldWS
可以发现多了一个叫getUserInfo的方法连接进入此方法的调用测试页面调用此方法后就可以看到此web service方法的调用结果以下是结果截图
educitycn/img_///jpg >从调用测试结果页面可以看到这一次的Return Value是
comwnetwwsdemoUserInfod
这正是我们的web service方法返回值类型类型的一个对象图中的下面也以SOAP消息的形式描述了调用的输入和返回结果
我们接着修改测试类HelloWorldWSTestjava