设为首页 加入收藏

TOP

通向架构师的道路(第十天)之 Axis2 Web Service(一)(三)
2018-02-08 09:56:58 】 浏览:737
Tags:通向 架构 师的 道路 Axis2 Web Service
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能够有阅读能力。

  • Axis2中的Webservice的入口

不是: http://localhost:8080/Axis2Service/services/HelloWorld?wsdl这个哦,而应该是:

http://localhost:8080/Axis2Service/services/HelloWorld,不带?wsdl。

  • 看一个wsdl中的namespace是什么:

  • 看一个wsdl中的web service方法名是什么

  • 看一个wsdl的返回结果是怎么样的格式:

为此我们在程序里增加了一行: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
首页 上一页 1 2 3 4 5 6 下一页 尾页 3/6/6
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇通向架构师的道路(第九天)之 we.. 下一篇通向架构师的道路(第八天)之 we..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目