一、 SOAP协议的实现原理
用soap实现远程调用,就是在相同或不同平台之间完成客户端和服务器端的通信。即客户端发送soap请求,服务器端接受请求,分析其中包含的信息,调用相应的函数并将返回值封装成soap消息发送给客户端,最后客户端解析应答消息。归根到底就是通过http在http请求的body部分发送soap协议封装的xml信息,所以本质上也可以直接通过socket或httpclient来发送soap请求到webservice服务地址。比如:
//建立与WebService服务端的连接
Socket sock = new Socket("192.168.2.6", 8080);
//建立向WebService服务端的输出流,编码格式为UTF-8
BufferedWriter wr = new BufferedWriter(new OutputStreamWriter(sock.getOutputStream(),"UTF-8"));
//参照用Ethereal截获的信息一样向输出流写入数据
//path就是webservice服务的相对地址
wr.write("POST "+path+" HTTP/1.0\r\n");
wr.write("Host: "+host+"\r\n");
wr.write("Content-Length: 593\r\n");
wr.write("Content-Type: text/xml; charset=\"UTF-8\"\r\n");
wr.write("SOAPAction: \"\"\r\n");
wr.write("Accept: */*\r\n");
wr.write("Cache-Control: no-cache\r\n");
wr.write("Pragma: no-cache\r\n");
wr.write("\r\n");
wr.write(xmldata);
wr.flush();
...
wr.flush();
//建立来自WebService服务端的输入流
BufferedReader rd = new BufferedReader(new
InputStreamReader(sock.getInputStream()));
String line;
StringBuffer xmlReturn=new StringBuffer();
//循环读入从服务端发送回来的数据
while((line = rd.readLine()) != null)
{
xmlReturn.append(line);
}
sock.close();
按照上面这个思路,我们可以直接使用Socket实现WebService客户端,同样可以调用标准的WebService服务端。唯一的
缺点就是,我们需要对WebService返回的信息进行
解析。由于WebService返回的内容是XML格式的。所以我们可以使用DOM或SAX对XML进行解析。只是还是稍显麻烦。不过即便如此,我们用Socket直接调用WebService,这已经很大程度上解决了如果编写一个通用WebService客户端的问题。所以用这种方式编写的客户端,不仅可以调用不同Java WebService框架发布的WebService,甚至也可以调用不同语言开发平台上发布的WebService。
注意,实际使用中是很少这样做的,已经有很多框架支持自动生成客户端和服务端代码,可以像普通api一样调用webservice方法。
1.1 体系结构
用户程序可以通过soap实现远程调用,首先用户程序向一个名为SoapClient的对象发送消息请求服务器上某一名为operation的操作,SoapClient处理该消息后向服务器发出soap请求。在服务器端,由一个名为SoapServer的对象接受请求调用相应的组件方法执行相应的操作。SoapServer获得操作结果后将其以soap应答的形式返回给客户端。最后,客户端的SoapClient处理处理SOAP应答并将结果封装在消息中发送给用户程序。这样,通过SoapClient和SoapServer的桥梁作用,客户端便可以调用本地函数一样调用服务端的函数。客户端和服务器端通信的数据流图如下图:
在实际应用中,当使用SoapClient和SoapServer进行SOAP的请求应答时,客户端和服务器端都必须先通过一个名为javax.wsdl.xml.WSDLReader(在wsdl4j-version.jar中)的对象来获取WSDL文件中的Soap消息结构,以此保证通信的一致性。下面分别描述客户端和服务端的具体实现情况。
1.2 客户端
SoapClient在接受用户程序的远程服务请求后,一方面,通过WSDLReader从服务器上获取wsdl文件,为相应的服务操作产生一个名为WSDLOperation的对象,WSDLOperation调用名为GetOperationParts的方法,获得操作的输入输出消息格式,另一方面,SoapClient为服务操作的每个参数产生一个名为SoapMapper的对象,并调入各对象操作所需的参数值。一个名为SoapSerializer的对象从相应的SoapMapper中建立SOAP请求消息并通过一个名为SoapConnecter的对象发送给服务器,同时侦听服务器的应答。当服务器处理SOAP请求并将SOAP应答返回给客户端后,SoapReader将结果赋值给相应的SoapMapper,同时也将结果返回给用户程序,详细的数据流图如下图:
1.3 服务器端
当服务器端的SoapServer接收到客户端的Soap请求后,一方面,SoapReader将请求消息存放到一个DOM结构中,WSDLReader将wsdl文件存放到另一个DOM结构中,然后分析该请求并为其产生一个WSDLOperation对象,WSDLOperation调用GetOperationParts方法,获得操作的输入输出消息格式;另一方面,SoapServer为服务操作的每个参数产生SoapMapper对象,并调入各对象操作所需的参数值。SoapServer调用与该操作响应的组件方法后,将返回结果映射到相应的SoapMapper对象中,并用SoapSerializer将返回值封装在Soap应答消息中并发送到客户端,详细的数据流图如下:
1.4 其他
从上面客户端和服务端的调用过程,我们看到webservice的调用中存在着序列化和反序列化的过程,也就是按照一定的编码格式(soap协议本身就有内置的类型转换规范: http://schemas.xmlsoap.org/soap/encoding/),把对象映射为xml或根据xml把对象映射为对象,因此webservice调用中的传递的参数也都必须可序列化。
参考:
http://www.ibm.com/developerworks/cn/webservices/ws-soapmap/part1/index.html
http://www.ibm.com/developerworks/cn/webservices/ws-soapmap/part2/index.html
了解jax-rpc和jax-ws的区别还可以参考:
http://www.ibm.com/developerworks/cn/webservices/ws-tip-jaxwsrpc.html
参考:
《SOAP的原理及实现》 杭州电子工业学院学报
- 大小: 30.2 KB
- 大小: 62 KB
- 大小: 72.6 KB
分享到:
相关推荐
在IT行业中,Web服务是一种广泛使用的通信协议,它允许不同应用程序之间进行数据交换。CXF是一个流行的开源框架,用于创建和消费Web服务,而Spring框架则是一个强大的Java企业级应用开发平台。本教程将深入探讨如何...
- **AMF**:Action Message Format,是一种轻量级的数据交换格式,主要用于Flex客户端与服务器端的数据传输。通过AMF协议,Flex客户端可以直接调用服务器端的远程对象,实现高效的数据交互。 - **Service**:通常指...
Web服务(WebService)是一种基于互联网的、平台独立的交互方式,允许不同系统之间进行数据交换和功能调用。本示例将重点讲解Web服务客户端与服务器端的实现,以XFireWSC、AxisWSC和XFireWSS为例进行阐述。 1. ...
- 使用Visual Studio的调试工具,如断点、监视窗口等,可以检查调用Web Service时的数据流和状态。 - 可以利用模拟服务器工具(如SOAPUI)进行接口测试,确保客户端正确地发送和接收数据。 总的来说,使用VC开发...
在IT领域,WebService是一种基于标准的、平台无关的、可以在不同系统之间交换数据的方式。它利用XML(可扩展标记语言)作为数据格式,HTTP作为传输协议,SOAP(简单对象访问协议)作为消息传递机制,使得应用程序...
Web服务(Web Service)是一种基于互联网的标准,允许应用程序之间进行交互和数据共享。在Web服务的世界里,SOAP(Simple Object Access Protocol)和XFire是两种常见的实现方式。 **SOAP(简单对象访问协议)** ...
在IT行业中,Web服务是一种允许不同应用程序之间进行通信和数据交换的方法。XFire是一个流行的开源框架,用于构建和消费Web服务。在这个极简的XFire Web服务Demo中,我们将探讨如何利用XFire来创建服务端以及客户端...
$result = $client->subtract(array('num1' => 10, 'num2' => 5)); // 调用subtract方法 echo "Subtract result: " . $result . "\n"; ``` 运行这个客户端脚本,你会看到计算结果。 ### 总结 通过这个简单的示例...
读取超时则是在连接成功建立后,客户端等待服务器返回数据的时间。如果超过这个时间,还没有接收到任何数据,客户端也会抛出异常。这有助于防止由于服务器延迟或无响应导致的阻塞。 配置CXF的超时设置通常可以通过...
WebService访问客户端是一种工具,主要用于与服务器上的WebService接口进行交互,进行数据的发送和接收。在本场景中,"SoapUI-x32-5.2.1.exe" 是一个流行的开源工具,即SmartBear的SoapUI,用于测试和调试SOAP(简单...
WebService客户端是基于Web服务的一种应用程序接口,它允许不同的系统通过Internet进行通信和数据交换。在本实例中,我们将深入探讨如何创建和使用一个WebService客户端,这个客户端与名为"Cxf_springService.zip"的...
这个jar包可能包含了与服务器通信的协议定义、数据模型、以及用于解析和序列化消息的代码。为了能够调用Web服务,Xfire客户端还需要其他支持库,如用于处理Web服务请求和响应的API。 Web服务通常基于SOAP(Simple ...
下面将详细介绍“webservice(cxf)”以及如何在Spring MVC和MyBatis环境下构建客户端和服务器端。 首先,让我们来理解Web服务的基本概念。Web服务是一种通过网络提供和使用功能的软件系统,通常基于开放标准,如WSDL...
在Java中调用WebService客户端是开发中常见的任务,主要用于与远程服务器进行数据交互。这篇PDF文档主要介绍了四种调用WebService的方式:HttpGet、HttpPost、HttpSoap和Documentation,并且提供了一个使用Apache ...
4. **接收响应**:调用`getInputStream`获取服务器的响应流,然后读取数据。如果是XML响应,可以使用JAXB的`Unmarshaller`反序列化成Java对象。 5. **处理结果**:解析得到的Java对象,进行后续业务逻辑处理。 在...
在IT行业中,Web服务是一种广泛使用的通信协议,它允许不同系统之间通过互联网交换数据。Apache CXF是一个流行的开源框架,用于构建和消费Web服务。本篇文章将深入探讨如何使用Apache CXF来创建一个Web服务客户端。 ...
在Android开发中,Web Service是一种常见的通信方式,用于在客户端(Android应用)和服务器之间交换数据。本实例将深入探讨如何构建一个Android Web Service客户端和服务端,并提供可直接运行的代码示例。以下是对这...
在IT行业中,Web服务是一种广泛使用的通信协议,它允许不同应用程序之间进行数据交换。XFire是Java平台上一个曾经流行的开源框架,专门用于构建和消费Web服务。本实例将深入探讨如何利用XFire来实现Web服务。 一、...