soap笔记
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
SOAP笔记
1. SOAP 简介
SOAP(Simple Object Access Protocal ),即简单对象访问协议,是在分散或分布式的环境中交换信息的简单协议,它以XML 作为数据传送的方式。
SOAP 采用的通信协议可以是HTTP/HTTPS 协议,也可以是SMTP/POP3协议。
SOAP 系统有两种工作模式,一种称为RPC (Remote Procedure Call ),另一种叫法不统一,在Microsoft 的文档中称为Document-Oriented,而在Apache 的文档中称为Message-Oriented,这是一种可以利用XML 交换更为复杂的结构数据的应用,通常以SMTP 作为传输协议。
本文主要讨论RPC 。
可以把SOAP RPC 简单的理解为这样一个开放协议:SOAP=RPC+HTTP+XML 。
它有以下特征:
● 采用HTTP 作为通信协议,采用客户/服务模式。
● RPC 作为统一的远程方法调用途径。
● XML 作为数据传送的格式,允许服务提供者和客户经过防火墙在Internet 上进行通信
交互。
SOAP 客户访问SOAP 服务的流程如下:
● 客户程序创建一个XML 文档,它包含了提供服务的服务器的URI 、客户请求调用的方
法名和参数信息。
如果参数是对象,则必须进行XML 序列化操作。
● 目标服务器接收到客户程序发送的XML 文档,对其进行解析。
如果参数是对象,则先
对其进行XML 反序列化操作,然后执行客户请求的方法。
● 目标服务器执行方法完毕后,如果方法的返回值是对象,则先对其进行XML 序列化操
作,然后把返回值以XML 文档返回给客户。
● 客户程序接收到服务器发来的XML 文档,如果返回值是对象,则先对其进行XML 反
序列化操作,最后获得返回值。
2.AXIS是什么
Apache AXIS是Apache软件组织对SOAP规范的实现,是Apache SOAP项目的第三代产品。
在Apache AXIS软件中提供了一个Apache-AXIS Web应用,可以把它发布到Tomcat服务器中。
Tomcat充当Apache-AXIS Web应用的容器,而Apache-AXIS Web应用又充当SOAP服务的容器。
SOAP客户程序可以通过Apache AXIS API来发出RPC请求,访问SOAP服务。
Apache AXIS使用Web服务发布描述文件WSDD(Web Service Deployment Descriptor)来发布SOAP服务,定义SOAP服务,指定实现这项服务的类名和方法名,为在网络上传输的JavaBean对象指定专门的XML序列化器和反序列化器。
3.用Jbuilder实现的例子
在Jbuilder中新建一个project,取名testsoap;在此project中新建一个Web Application,取名SOAPWeb;在project中新建一个类server.java,在此类中写一个方法hello(),源码如下:
package testsoap;
public class server {
public server() {
}
public static void main(String[] args) {
server server1 = new server();
}
public String hello(){
return "hello";
}
}
此类写好后,在Jbuilder中右键点击此类,选择Export as Web Service,WebApp选择刚建立的web Application,Toolkit选择Apache AXIS,其它默认,点击finish。
此时观察project中generated包中,Apache Axis自动帮助生成了很多文件:Server.java,ServerService.java,ServerServiceLocator.java,
ServerServiceTestCase.java,ServerSoapBindingStub.java
在Web Application中可以看到自动生成的web.xml和wsdd等文件。
Run project启动服务器;服务端就写好了。
在project中新建一个类client.java,用来访问服务端的方法,下面是源代码:
package testsoap;
import org.apache.axis.client.Service;
import org.apache.axis.client.Call;
import org.apache.axis.encoding.XMLType;
import org.apache.axis.utils.Options;
import org.apache.axis.encoding.ser.*;
import space.QName;
import javax.xml.rpc.ParameterMode;
public class client {
public client() {
}
public static void main(String[] args) {
System.out.println("-----------Start------------");
try{
Service service = new Service();
Call call = (Call) service.createCall();
//设置服务端的地址
call.setTargetEndpointAddress(new .URL
("http://localhost:8080/testsoap/services/server"));
//设置要访问的方法名
call.setOperationName(new QName("Service","hello"));
//设置方法参数类型
call.addParameter("op1",XMLType.XSD_STRING ,ParameterMode.IN );
//设置返回类型
call.setReturnType(XMLType.SOAP_STRING);
//访问方法,参数为”AXIS”
String ret = (String)call.invoke(new Object[]{“AXIS”});
System.out.println(ret);
System.out.println("------------end-------------");
}catch(Exception e){
System.out.println(e.getMessage());
}
}
}
写好后,运行客户端,发现控制台打印出hello:AXIS,与服务端通信成功,这个简单的例子就完成了。
赵禄强
2005-8-4。