1、前言:
今日部门的产品须要用到短信功能,须要走公司统一的接口,而该短信接口是由.net开发的,利用两天时间完全搞定了用java来调用.net 的web service,包括对soap header的处理。
2、解决方案
查询了下java中对soap的支持,有几种方案,有axis和xfire等,我这里先选择的是axis的1.4版本,随即开始开发,这里面有个大坑啊。就是java对类的属性中的getXXXX方法解析后生成的xml文件的属性首字母是小写的,与.NET的生成的xml对不上,光这个问题耗费了很长的时间,最后依然决定用axis2来作,用了不到2个小时所有搞定。
3、遇到了问题怎么办?
在使用axis1.4的过程当中,遇到这样的那样的问题,我认为最大的问题在于用axis生成的xml文件与.net的不一致,因此才会有这样那样的问题,个人办法是,安装一个wireshark进行抓包,而后比对看看哪些属性生成的不对这样再去改代码,事半功倍。关于wireshark的用法你们能够去google。
对于用axis的方案你们直接用axis2就行了,去官方下载一个,若是不清楚包的结构,直接把lib下的全部jar包都引进去吧。省得一个一个的引。
4、过程
前面说到了,须要认真看.net返回的xml文件,若是某个方法存在soap:Header的话,那么在java端就须要构造header,有可能不一样的方法对应不一样的header,这个须要看清楚了。
不说了,直接上过程及代码。
1.下载axis2,这个是必须的,官方下载吧,而后解压
3.以后会在bin目录下生成一个src目录,将生成的两个类拷贝到项目中。
4.而后,那就是基本上和.net引用.net的web service同样同样的了。
OK,下面只给出一个例子,包含header头、传递复杂类型及接收返回值
ServiceStub stub = new ServiceStub(); //这个是生成的类,可能你的类名和个人是不同的
stub._getServiceClient().getOptions().setProperty(org.apache.axis2.transport.http.HTTPConstants.CHUNKED, Boolean.FALSE);
//加入头部验证
WebSoapHeadE headerE=new WebSoapHeadE();//这里的生成的类可能和你的也不一样
WebSoapHead header=new WebSoapHead();//这个header便是.net的web service的header头
header.set.........//这里执行一些属性赋值操做,通常包括用户名和密码之类
headerE.setWebSoapHead(header); //须要将该头加进去
好了到这里咱们的头信息就构造完毕了,这里只是构造好了,须要到下面执行某个接口方法的时候把该头传递进去。
再看传递自定义对象
好比我这里的这个发短信的业务,生成的方法为sendSms(自定义对象,头信息);
好的这里咱们须要构造这个自定义对象,原.net的sendSms方法的参数为一个自定义对象的数组,那么这里咱们该怎么写呢?
axis为咱们提供了一个相似ArrayOfXXXX的包装对象,构造这个对象而后将xxxx对象加进去便可。
到这里,咱们基本完成了调用.net webservice的全部工做。
但愿这篇文章能给你带来帮助。