tOMFactory();
OMNamespace omNs = fac
.createOMNamespace("http://helloworld.axis2.sky.org", "");
OMElement method = fac.createOMElement("sayHello", omNs);
OMElement name = fac.createOMElement("name", omNs);
name.setText("ymk");
method.addChild(name);
method.build();
OMElement response = sender.sendReceive(method);
System.out.println(response);
OMElement element = response.getFirstChildWithName(
new QName("http://helloworld.axis2.sky.org", "name"));
System.out.println(element.getText());
} catch (AxisFault e) {
System.out.println("------Error Occured------");
e.printStackTrace();
}
}
public static void main(String[] args) {
HelloWorldWithReturnClient testClient = new HelloWorldWithReturnClient();
testClient.sayHello();
}
}
注意我加粗或者是加粗标红处的代码,为核心代码。
由于我们使用提Axis2的底层API来调用WebService而并不是像傻瓜式的通过一个wsdl生成Web Service调用句柄,所以我们要对一个WSDL能够有阅读能力。
不是: http://localhost:8080/Axis2Service/services/HelloWorld?wsdl这个哦,而应该是:
http://localhost:8080/Axis2Service/services/HelloWorld,不带?wsdl。
- 看一个wsdl中的web service方法名是什么
为此我们在程序里增加了一行:OMElement response =sender.sendReceive(method);
然后直接:System.out.println(response);
这样,我们可以看到它的返回为:
根据Axis2的OMElement的解析语法我们就可以直接把这个返回的值get出来。
我们甚至可以用opensource的SOAP UI这个工具,来直接得到我们的webservice调用的返回值,并以此返回结果的格式来决定我们如何去解析这个OMElement格式的返回结果:
在工程上单击右键选“AddWSDL”
在弹出对话框中直接把http://localhost:8080/Axis2Service/services/HelloWorld?wsdl加入对方框中的wsdl栏中
点OK生成webservice soap ui调用的客户端如下图
它会生成11Binding和12Binding两个客户端,我们把11Binding的节点展开,双击Request 1,在右边会显示调用的soap样例,在<hel:sayHello>?</hel:sayHello>块中我们把问号替换成Monica,然后点上方“绿色”运行按钮,我们就可以得到调用结果如下图:
因此通过SOAP UI我们也可以测试我们的Web Service。
4.2 非阻塞式HelloWorldWithReturnNonBlock.java
与传统的阻塞式webservice调用不同的是,一旦调用”serviceClient.sendReceive(payload);”,客户端将会被阻塞直到操作完成。这种方式在有很多Web Service需要在一个单一的客户端应用程序中启动时很不可取。一种解决方法是使用Non-Blocking API来调用这些Web Services。Axis2提供给用户一种基于回叫机制的non-blocking API。
很多网上使用的“回调”接口都只能在Axis21.3中才能使用,而在Axis21.4中回调接口已经被升级成一个抽象类叫AxisCallBack类了,因此90%目前网上的关于“非阻塞式”的客户端的代码在Axis2中都是跑不起来的,在eclipse ide中会显示“该类/方法已经被deprecated(废弃)”。
因此请注意看笔者的代码,先声明一个用于非阻塞调用的回调(callback)类
HelloWorldNonBlockCB.java
package org.sky.axis2.helloworld;
import java.util.Iterator;
import javax.xml.namespace.QName;
import org.apache.axiom.om.OMElement;
import org.apache.axiom.om.OMNode;
import org.apache.axis2.client.async.AxisCallback;
import org.apache.axis2.context.MessageContext;
import org.apache.axis2.databinding.utils.BeanUtil;
import org.apache.axis2.engine.DefaultObjectSupplier;
public class HelloWorldNonBlockCB implements AxisCallback {
private boolean complete = false;
public void onMessage(MessageContext msgContext) {
System.out.println(msgContext.getEnvelope().getBody());
OMElement element = msgContext.getEnvelope().getBody()
.getFirstElement();
OMElement result = element.getFirstChildWithName(new QName(
"http://helloworld.axis2.sky.org