`
andy54321
  • 浏览: 441590 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

SOAP与AXIS2入门教程(附带实例)

阅读更多

转载自:http://blog.csdn.net/daryl715/archive/2007/05/09/1602283.aspx

 

最近项目需要用到SOAP以及AXIS2的知识,在学习之余,将第一天学到的内容整理了一下,一来做为笔记做个记录,二来如果有需要的,可以做为参考,今天主要是完成了一下功能,通过一个SOAP请求消息(可以自己构造也可以通过指定一个xml文件),然后在Web Service中获取这个SOAP请求消息(一个OMElement对象),通过解析这个对象,获取需要的信息,然后对这些信息进行业务处理,最后返回一个SOAP响应消息。
获取AXIS2 1.1,由于做项目一般使用稳定的发布版本,所以本文没有使用最新的AXIS2 1.1.1版本,该版本可以从Apache官方网站下载。下载地址如下:
在上面连接中,有三个版本的axis2可以供下载,分别是:Standard Binary Distribution,Source Distribution,WAR (Web Archive) Distribution,其中标准版可以直接独立使用(Stand-alone),源代码版本需要使用maven进行构建,同时允许开发人员自己修改源代码,本文使用的是WAR版本,可以直接发布在WEB容器中(本文使用的是Tomcat5.5.17)。在上面的链接中还有一个是DOCS的下载,最好一并下载,docs中包含用户手册,快速上手指南,以及其他相关文档,对了解并熟悉AXIS2很有帮助。
闲话少说,将已经下载的WAR包发布(拷贝+粘贴)到%TOMCAT_HOME%/webapps/目录下,其中%TOMCAT_HOME%以Tomcat安装目录进行替换。启动Tomcat,在IE地址栏中键入:http://localhost:8080/axis2,如果部署成功,即可看到欢迎页面,一般情况下不会出现什么错误。
进入主页之后,可以通过进入Administration链接来管理WEB服务,其中初始化用户名和密码分别为admin/axis2。一般情况下,在管理控制台下进行操作比较方便,但是本文将直接进行操作系统目录级的操作(不会使用UploadServices进行发布服务,而是直接将*.aar拷贝到%TOMCAT_HOME%/webapps/axis2/WEB-INF/services目录下)。
下面我们建立自定义的WEB服务:
我们要将类似以下XML格式的SOAP请求转换为SOAP响应,并获取SOAP请求中的关键元素,进行业务操作,本例子中只是简单的将数值拷贝,没有进行实际的业务操作,但是在代码中进行了指示:
SOAP请求:
<?xml version="1.0" encoding="utf-8" ?>
<soap:Envelope>
 <soap:Header />
 <soap:Body>
    <RevokeCertRequest>
      <Issuer>ABC</Issuer>
      <Serial>DEF</Serial>
      <RevocationDate>GHI</RevocationDate>
    </RevokeCertRequest>
 </soap:Body>
</soap:Envelope>
 
SOAP响应:
<?xml version="1.0" encoding="utf-8" ?>
<soap:Envelope>
 <soap:Header />
 <soap:Body>
    <RevokeCertResponse>
      <RevokeDate>GHI</RevokeDate>
    </RevokeCertResponse>
 </soap:Body>
</soap:Envelope>
 
 
在实际应用中,我们可能要获取ABC,DEF,GHI来进行业务处理,最后返回一个其他的消息,但是在示例中,我们仅仅获取ABC,DEF,GHI,然后打印出来,并返回GHI。
 
Step1.建立工程并创建文件
建立如下图所示的JAVA工程(工程的源代码路径与编译后路径不同,源代码为project/src,编译后为project/bin):首先建立一些类,然后创建serives.xml,最后建立build.xml文件(ANT的构建文件,为了方便测试与构建,所以使用了ANT)
 
下面是这些文件的内容:
 
RevokeService.java(这个是进行WEB服务的类):
package newsdes.support.service;
 
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
 
import javax.xml.namespace.QName;
 
import org.apache.axiom.om.OMAbstractFactory;
import org.apache.axiom.om.OMElement;
import org.apache.axiom.om.OMFactory;
import org.apache.axiom.om.OMNamespace;
 
public class RevokeService {
 
      /**
       * The request soap message object.
       */
      public static OMElement requestSoap = null;
 
      /**
       * Write the soap response message to xml file.
       *
       * @param res
       *            The resource of that forms the xml file.
       * @param filePath
       *            The path where the xml file be stored.
       */
      private static void writeResponse(String res, String filePath) {
           try {
                 FileOutputStream fos = new FileOutputStream(filePath);
                 byte[] bytes = res.getBytes();
                 fos.write(bytes);
                 fos.close();
           } catch (FileNotFoundException e) {
                 e.printStackTrace();
           } catch (IOException e) {
                 e.printStackTrace();
           }
      }
 
      /**
       * Generate the path where the xml file is stored.
       *
       * @param fileName
       * @return
       */
      private static String makePath(String fileName) {
           String path =
"C:/eclipse/workspace/SDES_Enhance/data/" + fileName;
           return path;
      }
//主要的WEB服务方法
      public OMElement RevokeCertRequest(OMElement soapBody) {
           requestSoap = soapBody;
           QName issuerName = new QName("Issuer");
           QName serialName = new QName("Serial");
           QName revocationDateName = new QName("RevocationDate");
           OMElement issuerElement =
requestSoap.getFirstChildWithName(issuerName);
           OMElement serialElement =
requestSoap.getFirstChildWithName(serialName);
           OMElement revocationDateElement = requestSoap
                      .getFirstChildWithName(revocationDateName);
           String issuer = issuerElement.getText();
           String serial = serialElement.getText();
           String revocationDate = revocationDateElement.getText();
           // print out the value
           System.out.println(issuer);
           System.out.println(serial);
           System.out.println(revocationDate);
 
           // TODO use "issuer,serial,revocationDate" to do business
 
           // Generate the soap response message
           OMFactory soapFactory = OMAbstractFactory.getOMFactory();
           OMNamespace omNs = soapFactory.createOMNamespace(
                      "http://www.sdes.net/", "");
           OMElement soapResponse = soapFactory.createOMElement(
                      "RevokeCertResponse", omNs);
           OMElement soapMain = soapFactory.createOMElement("RevokeDate", omNs);
           soapMain.setText(revocationDate);
           soapResponse.addChild(soapMain);
           soapResponse.build();
           String path = makePath("resMsg.xml");
           writeResponse(soapResponse.toString(), path);
           return soapResponse;
      }
}
 
该Service类主要实现了将传入的参数OMElement进行解析,获取其中的Issuer,Serial以及RevocationDate元素的值,然后进行业务处理(蓝色部分,省略)。然后根据业务操作结果,将响应返回。(这里仅仅是将内容写入到一个XML文件中)。
 
services.xml(WEB服务的配置文件,放置在META-INF目录下):
<serviceGroup>
      <service name="CertRevokeService">
           <description>
                 This is the service for revoking certificate.
           </description>
           <parameter name="ServiceClass" locked="false">
                  newsdes.support.service.RevokeService
           </parameter>
           <operation name="RevokeCertRequest">
                 <messageReceiver
                      class="org.apache.axis2.receivers.RawXMLINOutMessageReceiver" />
                 <actionMapping>urn:RevokeCertRequest</actionMapping>
           </operation>
      </service>
</serviceGroup>
其中serviceGroup中可以包含多个service,如果只有一个的时候,可以省略外层的serviceGroup元素。服务名为CertRevokeService。主要业务操作为RevokeCertRequest
红色部分标志了进行WEB服务的主要类。
 
Step2:进行打包
首先编写build.xml文件,为了简便(只是个例子,所以任务也比较简单,只是将project/bin目录下的内容进行JAR打包,文件名为SDES_Enhance.aar,其中.aar为AXIS2的应用的后缀名。)
<projectname="SDES_Enhance"default="deploy"basedir=".">
      <description>
            Deploy SDES_Enhance Services
    </description>
      <propertyname="dist"value="${basedir}/dist"/>
      <propertyname="service"value="C:/Tomcat5.5/webapps/axis2/WEB-INF/services"/>
      <targetname="init">
           <echo>Initializing the environment!</echo>
           <deletedir="${dist}"/>
           <deletedir="${basedir}/data"/>
           <mkdirdir="${dist}"/>
           <mkdirdir="${basedir}/data"/>
      </target>
      <targetname="jar"depends="init">
           <echo>Compressing files to .aar file!</echo>
           <jarbasedir="${basedir}/bin"destfile="${dist}/SDES_Enhance.aar"/>
      </target>
      <targetname="deploy"depends="jar">
           <echo>Deploying service!</echo>
           <copytodir="${service}">
                 <filesetdir="${dist}">
                      <includename="SDES_Enhance.aar"/>
                 </fileset>
           </copy>
      </target>
</project>
 
打包完成后,直接将SDES_Enhance.aar部署到
%TOMCAT_HOME%/webapps/axis2/WEB-INF/services目录下,在TOMCAT启动情况下,会进行HOT-DEPLOY,直接部署完成,在http://localhost:8080/axis2/axis2-admin/listService下刷新,可以看到部署的服务:CertRevokeService。如下图所示:
 
Step3:编写客户端测试代码:
建立测试类:TestCertRevokeService(通过构造一个SOAP请求对象,传入给服务,来实现返回一个SOAP响应的XML文件):
TestCertRevokeService.java
package com.neusoft.service.test;
 
import org.apache.axiom.om.OMAbstractFactory;
import org.apache.axiom.om.OMElement;
import org.apache.axiom.om.OMFactory;
import org.apache.axiom.om.OMNamespace;
import org.apache.axis2.AxisFault;
import org.apache.axis2.addressing.EndpointReference;
import org.apache.axis2.client.Options;
import org.apache.axis2.client.ServiceClient;
 
public class TestCertRevokeService {
      private static EndpointReference targetEPR = new EndpointReference(
                 "http://localhost/axis2/services/CertRevokeService");
 
      public static OMElement getSoapRequestMessage() {
           OMFactory factory = OMAbstractFactory.getOMFactory();
           OMNamespace omNs =
factory.createOMNamespace("http://www.sdes.net", "");
           OMElement issuer = factory.createOMElement("Issuer", omNs);
           OMElement serial = factory.createOMElement("Serial", omNs);
           OMElement revocationDate =
factory.createOMElement("RevocationDate",
                      omNs);
           issuer.setText("C=JP,O=FX,CN=SDES CA");
           serial.setText("1234567890");
           revocationDate.setText("2007-01-01T00:00:00.000Z");
 
           OMElement requestSoapMessage = factory.createOMElement(
                      "RevokeCertRequest", omNs);
           requestSoapMessage.addChild(issuer);
           requestSoapMessage.addChild(serial);
           requestSoapMessage.addChild(revocationDate);
           requestSoapMessage.build();
           return requestSoapMessage;
      }
 
      /**
       * @param args
       */
      public static void main(String[] args) {
           OMElement requestSoapMessage = getSoapRequestMessage();
           Options options = new Options();
           options.setTo(targetEPR);
           ServiceClient sender = null;
           try {
                 sender = new ServiceClient();
                 sender.setOptions(options);
                 sender.sendReceive(requestSoapMessage);
           } catch (AxisFault e) {
                 System.out.println(e.getFaultElements().toString());
           }
      }
}
 
其中,Options对象的setTo方法一定要写正确,这是将SOAP请求发送的终点,如果书写不对,将不能通过WEB服务来处理请求。
 
执行TestCertRevokeService类,可以看到在控制台(Tomcat)的控制台打印出了在CertRevokeService中要打印的消息。

 

 

发表于 @ 2007年05月09日 20:35:00|评论(4 <script type="text/javascript"></script> )|编辑

 

 

评论

#gwjjeff 发表于2007-08-14 21:32:26  IP: 221.13.241.*

老大,你的例子太好了,入门的好例子。。。。。
可是。。。。。。
QName issuerName = new QName("Issuer");
......
应该写成
QName issuerName = new QName("http://www.sdes.net", "Issuer");
......
就为调通这个,基本上axis2算入门了,看了n个sample才明白错哪儿。。。。。
#yuffonzhang 发表于2008-03-18 23:49:24  IP: 222.240.178.*
你好,朋友
我用你的例子服务能部署成功,但是客户端却运行不了,显示的错误是这里抛出了异常
try {
sender = new ServiceClient();
sender.setOptions(options);
sender.sendReceive(requestSoapMessage);
} catch (AxisFault e) {
System.out.println(e.getFaultElements().toString());
}

是这个错误:org.apache.axis2.AxisFault: Connection refused: connect

不知道老大懂不懂得,特请教一下
#yuffonzhang 发表于2008-03-19 00:10:12  IP: 222.240.178.*
现在客户端没问题了,但是服务端好像没有写文件,不知道怎么回事啊
#山东 发表于2008-04-26 17:04:35  IP: 124.42.44.*
我在这 <jarbasedir="${basedir}/bin"destfile="${dist}/SDES_Enhance.aar"/>
报错啊
找不到bin
楼主在么?
评论

相关推荐

    SOAP与AXIS2入门教程附带实例

    总结起来,SOAP与AXIS2是Web服务领域的重要组成部分,通过AXIS2,你可以轻松地创建、部署和使用SOAP服务。本教程将帮助初学者快速上手,通过实例实践,掌握AXIS2的基本用法,为后续的Web服务开发打下坚实基础。

    Axis2实用教程(入门教程包含实例)

    【Axis2实用教程入门概述】 Axis2是Apache软件基金会开发的一款强大的WebService引擎,它在WebService技术领域具有广泛的应用。作为一款先进的服务发布和消费平台,Axis2提供了丰富的功能,包括支持SOAP1.1和SOAP...

    axis2 soap技术

    ### Axis2 SOAP技术详解 #### 一、Axis2概述 Axis2是一款开源的Web服务框架,主要用于构建基于SOAP协议的服务端应用。它支持多种传输协议(如HTTP、JMS等)以及多种数据编码方式(如XML、JSON等)。Axis2在Java...

    axis2入门实例

    **标题:“Axis2入门实例”** 在IT领域,特别是Web服务开发中,Apache Axis2是一个广泛应用的SOAP(简单对象访问协议)服务器和客户端框架。它提供了高性能、灵活且可扩展的环境来创建和部署Web服务。这篇教程将带...

    SOAP Axis 三种发布调用方式简单实例

    本实例主要探讨了使用Axis进行SOAP Web服务发布的三种方法以及如何进行调用。 1. **命令行发布(Axis Ant Task)** Axis提供了Ant任务来发布Web服务。首先,你需要在项目中集成Ant构建工具,并将Axis的库文件添加...

    webservice的Axis2入门教程java版

    通过这篇Java版的Axis2入门教程,我们了解到如何轻松地利用Axis2构建和发布WebService,无需繁琐的配置文件。这种简化的方法使得开发人员可以更加专注于服务逻辑,而不用过于关心服务的底层实现。同时,由于Axis2的...

    axis2入门及简单例子

    Axis2 入门及简单例子 Axis2 是一个基于 Java 的 Web 服务框架,它提供了一个灵活、可扩展、可靠的方式来创建、部署和管理 Web 服务。Axis2 是 Apache 软件基金会的一个开源项目,是基于 SOAP 和 WSDL 的 Web 服务...

    s2axis2 实例

    【S2Axis2实例详解】 在Java世界中,Web服务的开发是一项常见的任务,而Seasar2 Axis2项目提供了一种高效且灵活的方式来实现这一目标。Seasar2是一个全面的Java应用框架,它包含了诸如数据库访问、事务管理、权限...

    axis2+spring整合实例

    标题"axis2+spring整合实例"表明了这个压缩包内容是关于如何将Apache Axis2服务框架与Spring框架进行集成的实践案例。Apache Axis2是用于构建Web服务和SOA(Service-Oriented Architecture)的高性能、灵活的开源...

    Axis2包括axis2入门文档,新手教程,Myeclipse下的安装

    本压缩包文件包含了关于Axis2的入门文档、新手教程以及在MyEclipse集成开发环境下的安装步骤,非常适合初学者进行学习。 1. **Axis2入门文档**:Axis2的核心概念包括模块、服务、消息引擎和服务部署。模块是Axis2的...

    axis2独立部署简单实例

    与Hessian接口实例相比,这可能意味着它涉及了HTTP协议下的SOAP服务,因为Hessian通常用于轻量级的二进制RPC通信,而Axis2支持多种协议,包括SOAP、RESTful等。 描述中提到“可以直接下载运行”,这意味着提供的...

    SOAP生成使用的AXIS2

    AXIS2与IDEA结合,可以便捷地生成Java类,这些类对应于SOAP消息的结构,使开发者能直接操作Java对象,而无需手动解析XML。 以下是使用AXIS2在IDEA中生成SOAP相关Java类的详细步骤: 1. **安装AXIS2插件**:首先,...

    AXIS2入门+进阶+webservice实例

    本资料集合包括了“AXIS2入门”、“AXIS2进阶”以及一个具体的“WebService实例”,旨在帮助初学者和有经验的开发者深入理解AXIS2及其在Web服务中的应用。 入门篇可能涵盖了以下内容: 1. **AXIS2基础概念**:介绍...

    Axis2 入门

    这个简明教程将引导你入门Axis2的使用。 首先,我们创建一个名为`StockQuoteService`的Java类,它包含了获取股票价格(`getPrice`)和更新股票价格(`update`)的方法。这里的`StockQuoteService`是一个简单的POJO...

    axis2教程及案例

    本教程旨在全面介绍Axis2的安装、开发、部署,以及如何进行session管理和SOAP模块监控,通过实战案例帮助你深入理解和应用Axis2。 1. **Axis2安装**:首先,你需要下载适合你操作系统的Axis2版本,然后解压到指定...

    Apache Web Services Axis2(1.4.1) 详细经典入门实例图文并茂

    本文将深入探讨Axis2 1.4.1版本的经典入门实例,通过Eclipse集成开发环境中的Axis2插件,帮助你快速理解和应用这一强大的Web服务工具。 一、Apache Axis2概述 Apache Axis2是Apache SOAP(Simple Object Access ...

    AXIS2客户端调用实例

    AXIS2是一个开源的Web服务框架,用于构建和部署SOAP(简单对象访问协议)和RESTful服务。在本文中,我们将深入探讨如何使用AXIS2客户端进行服务调用,包括AXIS2的基本概念、配置、服务引用以及调用流程。 **AXIS2...

Global site tag (gtag.js) - Google Analytics