全部博文(2065)
分类: 系统运维
2009-11-16 20:05:17
SOAP的消息被称为一个SOAP Envelope,包括SOAP Header和SOAP Body。其中,SOAP Header可以方便的插入各种其它消息来扩充Web Service的功能,比如Security(采用证书访问Web Service),SOAP Body则是具体的消息正文,也就是Marshall后的信息。
以下是一个典型的SOAP数据包:
<s:Envelope xmlns:s="">
<s:Header>
<m:transaction xmlns:m="soap-transaction" s:mustUnderstand="true">
<transactionID>1234transactionID>
m:transaction>
s:Header>
<s:Body>
<n:purchaseOrder xmlns:n="urn:OrderService">
<from>
<person>Christopher Robinperson>
<dept>Accountingdept>
from>
<to>
<person>Pooh Bearperson>
<dept>Honeydept>
to>
<order>
<quantity>1quantity>
<item>Pooh Stickitem>
order>
n:purchaseOrder>
s:Body>
Apache Axis本身也是一个Web Project,它内建了对SOAP的编码、解析,并为Client提供了一些使用SOAP Service的API,同时,为Web Service的发布提供管理,并对Client提交的处理请求作出响应。对于基于Axis的应用而言,我们可以将注意力完全放在具体Service和Client的设计上,而无需考虑中间的传输过程(对于Client而言,还需要使用一些Axis提供的访问SOAP服务的特定API),这一点是与XML RPC不同的地方。
Apache Axis可以从下载,当前的最新版本是1.4。
安装Axis的过程很简单:
1、解压Axis到任意目录下;
2、拷贝Axis目录下的webapps/axis目录到%TOMCAT_HOME%/webapps下;(这里面我是放置在了resin/webapps目录下)
3、为了便于编译和测试程序,添加环境变量:(添加三个环境变量进来!)
AXIS_HOME Axis的解压目录
AXIS_LIB %AXIS_HOME%/lib
AXISCLASSPATH %AXIS_LIB%\axis.jar;%AXIS_LIB%\commons-discovery-0.2.jar;%AXIS_LIB%\commons-logging-1.0.4.jar;%AXIS_LIB%\jaxrpc.jar;%AXIS_LIB%\saaj.jar;%AXIS_LIB%\log4j-1.2.8.jar
完成上述工作后,启动Tomcat,并用IE打开:,点击其中的Validation、List两个链接,如果没有报告任何错误,则说明Axis安装成功。
package demo.soap;
public class HelloService {
public String sayHello() {
return "Hello World!";
}
}
要发布上面的Service,需编写如下的配置文件:
<deployment xmlns="" xmlns:java="providers/java">
<service name="HelloService" provider="java:RPC">
<parameter name="className" value="demo.soap.HelloService"/>
<parameter name="allowedMethods" value="*"/>
service>
deployment>
将上述内容保存为%TOMCAT_HOME%\webapps\axis\WEB-INF\deploy.txt,并在其所在目录下执行:
java -cp %AXISCLASSPATH% org.apache.axis.client.AdminClient deploy.txt
package demo.soap;
public class HelloService {
public String sayHello() {
return "Hello World!";
}
}
于是 我将这个包整个放到这个axis目录下面去。结果成功执行!
然道非得将一个包全部都要移过去吗?这样不是很不方便!思考......
客户端的代码如下:
package demo.soap;
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
public class HelloClient {
public static void main(String [] args) throws Exception {
String endpoint = "" + "8080" + "/axis/services/HelloService"; // Attention: A little difference 远程方法的URI
Service service = new Service();//创建一个服务对象
Call call = (Call)service.createCall();//调用CALL对象
call.setTargetEndpointAddress(new java.net.URL(endpoint));
call.setOperationName("sayHello");//调用远程方法
String res = (String)call.invoke(new Object[] {});//调用
System.out.println(res);
}
}
其实发现:通过调用SOAP的方式其实就是一种RPC的方式。即我将一个方法定义在服务端能够通过HTTP的方式访问到这个方法的。然后我在客户端进行调用这个方法取出来其中的方法体。
这个不就是像RMI方式吗.也即XML-RPC
(在A地将服务方法定义好然后在B地接收接口参数然后)
发布后如何删除对应的Service呢?要删除上面发布的HelloService服务,只需在%TOMCAT_HOME%\webapps\axis\WEB-INF目录下添加如下的undeploy.txt描述文件,其内容如下:
<undeployment xmlns="">
<service name="HelloService"/>
undeployment>
然后执行:
java -cp %AXISCLASSPATH% org.apache.axis.client.AdminClient deploy.txt
以更新server-config.wsdd文件。
刷新一下页面:
将看到前面已发布的对应的Service已被删除。
(测试过没问题能够正常删除这个服务的!)
如果以后还要发布新的Service,你可以选择直接更新上面产生的server-config.wsdd文件,或者重复上面的步骤。
(即这个wsdd文件就是一个服务配置文件如果想要新增一个新的服务进来就可以配置一下就OK)
chinaunix网友2009-11-17 08:53:47
现在比较流行流行的Web Service主要有三种,分别来说说: 1)SOAP SOAP,全名是Simple Object Access Protocol,是Microsoft提交给W3C的Web Service协议。我觉得SOAP的两个最大的好处是: * 协议的可扩展性(Extension Mechanism) * 良好的工具支持 2)XMLRPC 3)REST REST - Representational State Transfer, 是Roy Fielding的博士论文中提出的概念,其实,与其说REST是一种Web Service协议,不如说REST是一种Web based软件架构,一种基于Resource State的服务访问架构。