科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道基础软件Web服务规范SOAP之构建SOAP服务

Web服务规范SOAP之构建SOAP服务

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

如果您觉得构建 Web 服务客户机的过程相当简单,事实的确如此。而就很多方面而言,构建服务的过程也同样简单。

作者:佚名 来源:论坛整理 2007年11月17日

关键字: Web服务 构建 SOAP

  • 评论
  • 分享微博
  • 分享邮件
如果您觉得构建 Web 服务客户机的过程相当简单,事实的确如此。而就很多方面而言,构建服务的过程也同样简单。

  总体过程

  创建 Axis2 Web 服务的整个过程涉及以下步骤:

  • 创建服务清单
  • 创建类
  • 将其打包为 Axis 存档文件
  • 将 Axis 存档文件上载到 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;
    }
}

  要编译此应用程序,请确保 /lib 中的所有 *.jar 文件都在您的 CLASSPATH 上。

  此应用程序相当简单,仅包含一个与 getNumbereOfArticles 操作对应的类。此函数和任何要作为操作的函数一样,接收单个 OMElement 参数(表示有效负载)。此处,您将首先使用 build() 方法来确定已接收到所有数据——AXIOM 使用一个 pull 方法访问数据——然后将元素从其当前树中分离,以便能够将其返回。

  如果喜欢冒险,可以自由地部署服务和访问服务,以访问服务并查看结果。应该看到与清单3 中所示类似的结果输出。

  清单3. CMSService 类响应

<cms:getNumberOfArticles><cms:category>classifieds</cms:category></cms:
getNumberOfArticles>

  接下来让我们了解如何实际处理数据。

  提取有效负载

  为了从有效负载提取信息,将使用与 DOM 非常类似的技术来对接收到的有效负载元素进行操作(请参见清单4)。

  清单4. 提取有效负载信息

...
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 元素的文本节点子项的值。这无疑非常简捷!

  创建并返回响应

  最后,将需要使用从请求的有效负载提取数据来创建响应。在本例中,将从第二个函数(在实际应用程序中,该函数将进行一些其他的工作)提供响应(请参见清单5)。

  清单5. 创建响应

...
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 的元素。

  numberOfArticles 元素的内容将为 articleCount() 函数返回的一个数字,在本例中,该函数可以为任何内容。在实际的应用程序中,将进行所需进行的任何工作来获取此数据。获取了此数据后,会将其设置为 numberOfArticles 元素的内容,并直接返回该元素。

  现在剩下的就是部署服务了。

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章