扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
总体过程
创建 Axis2 Web 服务的整个过程涉及以下步骤:
这就是全部步骤。让我们首先从服务清单开始。
创建清单
服务清单告知 Axis2 应用程序(就更大的范围而言,应用服务器)哪个请求与哪个类对应。例如,可以如清单1 中所示的那样指定两个服务函数。
清单1. 在清单中指定两个服务函数
<service name="CMSService">
<description>
This is a sample Web Service for the newspaper's
Content Managment System.
</description>
<parameter name="ServiceClass" locked="false"
>CMSService</parameter>
<operation name="getNumberOfArticles">
<messageReceiver class=
"org.apache.axis2.receivers.RawXMLINOutMessageReceiver"/>
</operation>
<operation name="addArticle">
<messageReceiver class=
"org.apache.axis2.receivers.RawXMLINOnlyMessageReceiver"/>
</operation>
</service>
首先,定义服务,提供其名称和描述,并指定实际为请求服务的类。接下来,定义实际的操作。请注意,此示例指定了两种不同类型的 messageReceiver。第一个 RawXMLINOutMessageReceiver 用于传统的请求/响应服务。第二个 RawXMLINOnlyMessageReceiver 用于单向消息。操作的名称与有效负载的根元素以及要执行的方法对应。
将此文件保存为 services.xml。
接下来,让我们创建实际的应用程序。
创建应用程序
让我们首先创建模拟前面看到的 echo 函数的类(将直接返回原始有效负载的副本),如清单2 中所示。
清单2. CMSService 类
import org.apache.axis2.om.OMElement;
import javax.xml.stream.XMLStreamException;
public class CMSService {
public OMElement getNumberOfArticles(OMElement element)
throws XMLStreamException {
element.build();
element.detach();
return element;
}
}
要编译此应用程序,请确保
此应用程序相当简单,仅包含一个与 getNumbereOfArticles 操作对应的类。此函数和任何要作为操作的函数一样,接收单个 OMElement 参数(表示有效负载)。此处,您将首先使用 build() 方法来确定已接收到所有数据——AXIOM 使用一个 pull 方法访问数据——然后将元素从其当前树中分离,以便能够将其返回。
如果喜欢冒险,可以自由地部署服务和访问服务,以访问服务并查看结果。应该看到与清单3 中所示类似的结果输出。
清单3. CMSService 类响应
<cms:getNumberOfArticles><cms:category>classifieds</cms:category></cms: 提取有效负载 为了从有效负载提取信息,将使用与 DOM 非常类似的技术来对接收到的有效负载元素进行操作(请参见清单4)。 清单4. 提取有效负载信息 ... 创建并返回响应 最后,将需要使用从请求的有效负载提取数据来创建响应。在本例中,将从第二个函数(在实际应用程序中,该函数将进行一些其他的工作)提供响应(请参见清单5)。 清单5. 创建响应 ... numberOfArticles 元素的内容将为 articleCount() 函数返回的一个数字,在本例中,该函数可以为任何内容。在实际的应用程序中,将进行所需进行的任何工作来获取此数据。获取了此数据后,会将其设置为 numberOfArticles 元素的内容,并直接返回该元素。 现在剩下的就是部署服务了。
getNumberOfArticles>
接下来让我们了解如何实际处理数据。
import javax.xml.stream.XMLStreamException;
public class CMSService {
public OMElement getNumberOfArticles(OMElement element)
throws XMLStreamException {
element.build();
element.detach();
String rootName = element.getLocalName();
OMElement categoryElement = element.getFirstElement();
String categoryElementName = categoryElement.getLocalName();
String categoryValue = childElement.getText();
return element;
}
}
请记住,有效负载的根是 getNumberOfArticles 函数接收的元素。在此情况下,将提取元素的名称,然后移动到第一个元素子项(与第一个子项不同,后者可能是空格文本节点)并提取其名称和值。请注意,使用的是 getText() 方法来提取实际上是 category 元素的文本节点子项的值。这无疑非常简捷!
import javax.xml.stream.XMLStreamException;
public class CMSService {
public OMElement getNumberOfArticles(OMElement element)
throws XMLStreamException {
element.build();
element.detach();
String rootName = element.getLocalName();
OMElement childElement = element.getFirstElement();
String childName = childElement.getLocalName();
String categoryValue = childElement.getText();
SOAPFactory factory = OMAbstractFactory.getSOAP12Factory();
OMNamespace namespace = factory.createOMNamespace(
"http://daily-moon.com/cms/", "resp");
OMElement resultElem = factory.createOMElement(
"numberOfArticles",namespace);
String actualValue =
(articleCount(categoryValue)).toString();
resultElem.setText(actualValue);
return resultElem;
}
private Integer articleCount(String catId){
//Perform some function such as searching the CMS
//database, and return the actual value. For our
//purposes, you'll hardcode it.
return new Integer(42);
}
}
首先,创建将用于创建所有其他对象的工厂,然后创建将添加到响应的有效负载的命名空间。接下来,创建实际结果元素,在本例中为名为 numberOfArticles 的元素。
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者