SOAP介绍
SOAP(Simple Object Access Protocol),即简单对象访问协议,是在分布式的环境中交换数据的简单协议,以XML作为数据传送语言。
SOAP有两种工作模式,一种是RPC(Remote Procedure Call),另一种是Message-Orientd。MO可以利用XML来交换结构更复杂的数据,通常以SMTP作为传输协议。
RPC模式的SOAP可以理解为这样一个开发协议:SOAP=RPC+HTTP+XML,具有以下特点:
采用HTTP作为通信协议,采用客户/服务模式;
RPC作为统一的远程方法调用途径;
传送的数据使用XML语言,允许服务提供者和客户经过防火墙在Internet上进行通信。
SOAP RPC的工作流程如下图所示:
搭建SOAP服务
本文采用Apache-AXIS Web应用作为SOAP服务的容器,使用Tomcat作为Apache-AXIS web应用的容器。SOAP客户程序可以通过Apache-AXIS API来访问SOAP服务。
搭建环境需要的软件包括:
Tomcat、Apache AXIS、mail.jar、activation.jar、xerces.jar。3个jar文件可以在sun的网站上下载,Apache AXIS的下载网址为:http://apache.mirror.phpchina.com/ws/axis。
Apache-AXIS web应用:把axis下载解压后,在lib子目录下包含了AXIS的所有JAR文件,在其webapps子目录下有个axis子目录,这个目录是一个用于发布SOAP服务的Web应用,可以称之为Apache-AXIS web应用。
在Tomcat上发布Apache-AXIS Web应用的步骤如下:
1 把activation.jar、mail.jar、xerces.jar复制到tomcat主目录下的common/lib目录下;
2 把前述Apache-AXIS web应用(axis子目录)复制到tomcat主目录的webapps目录下。
3 通过访问http://localhost:8080/axis,选择”Validate”可以验证安装,不能出现error。
<o:p> </o:p>
创建基于RPC的SOAP服务
1 创建提供SOAP服务的java类:
Package mypack;
Public class HelloService{
Public String sayHello(String name){
Return “Hello”+name;
}
}
编译完成后,将类文件放到<TOMCAT_HOME>/webapps/axis/WEB-INF/classes/mypack下。
2 创建SOAP服务的发布描述符文件
Apache AXIS使用Web服务发布描述文件WSDD(Web Service Deployment Descriptor)来发布SOAP服务。以下是HelloService的发布描述符文件,名为deploy.wsdd:
<deployment name=”test” xmlns=”http://xml.apache.org/axis/wsdd”
xmlns:java=”http://xml.apache.org/axis/wsdd/providers/java”>
<service name=”urn:helloservice” provider=”java:RPC”>
<parameter name=”className” value=”mypack.HelloService”/>
<parameter name=”allowedMethods” value=”sayHello”/>
</service>
</deployment>
以下是HelloService的删除WSDD文件,undeploy.wsdd文件:
<undeployment name=”test” xmlns=”http://xml.apache.org/axis/wsdd/”>
<service name=”urn:helloservice”/>
</undeployment>
注意:在上述描述符文件中,需要正确书写xmlns等属性。
<o:p> </o:p>
3 发布SOAP
有两种方式可以发布SOAP服务,命令行方式与web方式。在发布或删除SOAP服务时需要启动Tomcat。
发布命令:
Java org.apache.axis.client.AdminClient deploy.wsdd
删除命令:
Java org.apache.axis.client.AdminClient undeploy.wsdd
4 创建SOAP客户程序
SOAP RPC客户程序可以通过Apache AXIS API发出RPC请求,调用SOAP服务的方法,以下是访问前面发布的helloservice服务的sayHello方法的客户程序。
package Soap;<o:p></o:p>
import javax.xml.namespace.QName;<o:p></o:p>
import org.apache.axis.client.Call;<o:p></o:p>
import org.apache.axis.client.Service;<o:p></o:p>
public class HelloClient {<o:p></o:p>
public static void main(String[] args) {<o:p></o:p>
try{<o:p></o:p>
String name="Guest";<o:p></o:p>
<o:p></o:p>
String endpoint = "http://localhost:8080/axis/services/helloservice";<o:p></o:p>
Service service = new Service();<o:p></o:p>
Call call = (Call)service.createCall();<o:p></o:p>
call.setTargetEndpointAddress(endpoint);<o:p></o:p>
call.setOperationName(new QName("urn:helloservice","sayHello"));<o:p></o:p>
String ret = (String)call.invoke(new Object[]{name});<o:p></o:p>
System.out.println(ret);<o:p></o:p>
}catch(Exception e){<o:p></o:p>
e.printStackTrace();<o:p></o:p>
}<o:p></o:p>
}<o:p></o:p>
}<o:p></o:p>
<o:p> </o:p>
除了在命令行调用SOAP RPC服务外,也可以直接通过:http://localhost:8080/axis/services/urn:helloservice?method=sayHello¶meter=test来调用,运行结果为:<o:p></o:p>
<soapenv:Envelope>
−
<soapenv:Body>
−
<sayHelloResponse soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<sayHelloReturn xsi:type="soapenc:string">Hellozhoulb</sayHelloReturn>
</sayHelloResponse>
</soapenv:Body>
</soapenv:Envelope>
<o:p> </o:p>
5 发布JWS服务
JWS即Java Web Service 。将Java源文件改扩展名为jws,然后复制到<CATALINA_HOME>/webapps/axis目录下,AXIS会自动编译JWS文件,并把它加入到JWS服务中。
在本例中,可以把HelloService.java改名为HelloService.jws(需要去掉package,使用默认的包),再把改后的文件放在<CATALINA_HOME>/webapps/axis,然后可以通过URL:http://localhost:8080/axis/HelloService.jws?method=sayHello¶meter=test来访问该服务,得到的结果与步骤4一样。
<o:p> </o:p>