使用Soap消息调用Web Services

来源:互联网 发布:python与数据挖掘 pdf 编辑:程序博客网 时间:2024/05/16 11:46
 

简介: Web Services技术使异种计算环境之间可以共享数据和通信,达到信息的一致性。随着异种计算机环境的不断增加,我们会更加经常的调用各种不同计算机体系中编写和发布的Web Services,作者在本文中给出了使用VB应用程序调用java平台编写和发布的Web Services的实践过程, 并且分析了如何根据WSDL文件构造SOAP消息的方法。

一 SOAP简介

1.SOAP定义

SOAP(Simple Object Access Protocol )简单对象访问协议是在分散或分布式的环境中交换信息的简单的协议,是一个基于XML的协议.

它包括四个部分:

  1. SOAP封装(envelop): 封装定义了一个描述消息中的内容是什么,是谁发送的,谁应当接受并处理它以及如何处理它们的框架;
  2. SOAP编码规则(encoding rules): 用于表示应用程序需要使用的数据类型的实例;
  3. SOAP RPC表示(RPC representation): 表示远程过程调用和应答的协定;
  4. SOAP绑定(binding): 使用底层协议交换信息。

2.SOAP消息

SOAP采用了已经广泛使用的两个协议:HTTP和XML。其中HTTP用于实现SOAP的RPC风格的传输,而XML是它的编码模式,一个SOAP请求实际上就是一个HTTP POST请求。



其它详细的SOAP方面的信息请参考 http://www.w3.org/TR/2001/WD-soap12-20010709/


二 WSDL简介

WSDL (Web Services Description Language)是一种XML Application,他的作用是将一个Web Services描述为一组服务访问点.

WSDL文档将一个Web Services描述成一组网络端点或者端口,在WSDL中,由于服务访问点和消息的抽象定义已经和具体的服务期部署和数据格式绑定分离,因此可以再次使用这些抽象对象: 消息,是对需要交换信息的抽象描述;端口类型,是对Web Service提供的操作的抽象集合。

特定端口类型的具体协议和数据格式定义构成了一个可以从用的绑定,一个端口定义成一个可重用绑定和网络地址的关联,一组端口构成了一个服务。

WSDL在定义Web Sevices时使用了以下元素:

  • Types: 数据类型的容器,他采用一些类型系统(比如常用的XSD)
  • Message: 通信消息的抽象类型化定义
  • Operation: 服务提供的操作的抽象化描述
  • Port Type: 一个或者多个端点支持的一组操作的抽象
  • Binding: 特定端口类型的具体协议和数据格式定义
  • Port:定义为binding和网络地址的关联的单个的端点
  • Service: 一组相关的端点的结合

详细的WSDL定义和相关信息请参考: http://www.w3c.org/TR/wsdl


三 使用WSAD开发和发布一个Web Services


1.我们用WSAD(Websphere Studio Application Developer)创建一个HelloWorld的java类,他只有一个方法,就是返回一个字符串HelloWorld。
// HelloWorld.javapackage hello;public class HelloWorld {  public String getString(){    return "Hello World!";  }}

2.将该类作为web service 发布到WASD带的测试环境的服务器上

发布后我们可以在web工程的wsdl文件下面找到两个.wsdl文件: HelloWorld-service.wsdl, HelloWorld-binding.wsdl,HelloWorld-binding.wsdl文件中主要描述了这个web services的服务访问点,HelloWorld-binding.wsdl文件中则描述了这个web services的通信消息的数据结构、每个访问点支持的操作、特定的断口类型的具体协议和数据格式规范的绑定等信息,其具体的含义可以参考使用 WSDL 部署 Web 服务:


第 1 部分(http://www-900.cn.ibm.com/developerworks/cn/webservices/ws-intwsdl/part1/index.shtml)一文 HelloWorld-service.wsdl的内容如下:
<?xml version="1.0" encoding="UTF-8"?><definitions name="HelloWorldService" targetNamespace="http://localhost:808/WForecast/wsdl/HelloWorld-service.wsdl"  xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:tns="http://localhost:808/WForecast/wsdl/HelloWorld-service.wsdl"  xmlns:binding="http://www.helloworld.com/definitions/HelloWorldRemoteInterface"  xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/">  <import namespace="http://www.helloworld.com/definitions/HelloWorldRemoteInterface"   location="http://localhost:808/WForecast/wsdl/HelloWorld-binding.wsdl"/>  <service name="HelloWorldService">    <port name="HelloWorldPort" binding="binding:HelloWorldBinding">      <soap:address location="http://localhost:808/WForecast/servlet/rpcrouter"/>    </port>  </service></definitions>


HelloWorld-binding.wsdl的内容如下:
<?xml version="1.0" encoding="UTF-8"?><definitions name="HelloWorldRemoteInterface" targetNamespace="http://www.helloworld.com/definitions/HelloWorldRemoteInterface" xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:tns="http://www.helloworld.com/definitions/HelloWorldRemoteInterface" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/">  <message name="getString">    <part name="result" type="xsd:string"/>  </message>  <portType name="HelloWorldJavaPortType">    <operation name="getString">      <output name="getString" message="tns:getString"/>    </operation>  </portType>  <binding name="HelloWorldBinding" type="tns:HelloWorldJavaPortType">    <soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>    <operation name="getString">      <soap:operation soapAction="" style="rpc"/>      <output name="getString">        <soap:body use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="urn:HelloWorld"/>      </output>    </operation>  </binding></definitions>

3. 启动WSAD中的测试服务器

 

Web Service、WSDL、SOAP、HTTP的概念存在诸多联系,在不同的产品中体现的概念也不一样。本文旨在描述一下其联系 和区别。
WebService 和 WSDL的关系?
Web Service提供一种可被调用的服务,该服务必须通过WSDL定义接口,接口描述了WEB SERVICE 的逻辑定义(types,messages,portTypes)和传输协议(bindings,services)。客户端通过WSDL定义的访问方式和逻辑结构调用该服务。

Web Service和SOAP以及HTTP的关系?

SOAP是简单对象访问协议,定义了一种跨平台的分布式系统通信协议。SOAP需要绑定到更低层次的传输协议(比如, HTTP,RMI,JMS)等。最常用的是HTTP绑定,所以也经常把SOAP的概念和HTTP混在一起说。
比如:W3C定义 ”A Web service is a software system designed to support interoperable machine-to-machine interaction over a network. It has an interface described in a machine-processable format (specifically WSDL). Other systems interact with the Web service in a manner prescribed by its description using SOAP messages......"
   
理论上通过WSDL描述的Web Service可以有很多种不同的绑定,但是实际上经常使用SOAP HTTP绑定 (就是采用“SOAP通信协议的HTTP绑定格式”来绑定)。

小结一下,感觉狭义的Web Service肯定是用WSDL/SOAP/HTTP,泛义的Web Service只要用了WSDL就算。