天天看点

SOAP接口相关知识介绍

SOAP接口相关知识介绍

1      SOAP

1.1   什么是 SOAP?

·     SOAP 指简易对象访问协议

·     SOAP 是一种通信协议

·     SOAP 用于应用程序之间的通信

·     SOAP 是一种用于发送消息的格式

·     SOAP 被设计用来通过因特网进行通信

·     SOAP 独立于平台

·     SOAP 独立于语言

·     SOAP 基于 XML

·     SOAP 很简单并可扩展

·     SOAP 允许您绕过防火墙

·     SOAP 将被作为 W3C 标准来发展 

1.2   SOAP 构建模块

一条 SOAP 消息就是一个普通的 XML 文档,包含下列元素:

·     必需的 Envelope 元素,可把此 XML 文档标识为一条 SOAP 消息

·     可选的 Header 元素,包含头部信息

·     必需的 Body 元素,包含所有的调用和响应信息

·     可选的 Fault 元素,提供有关在处理此消息所发生错误的信息 

所有以上的元素均被声明于针对SOAP封装的默认命名空间中:  ​​http://www.w3.org/2001/12/soap-envelope​​​ 以及针对 SOAP编码和数据类型的默认命名空间 ​​http://www.w3.org/2001/12/soap-encoding​​

1.3

这里是一些重要的语法规则:

·     SOAP 消息必须用 XML 来编码

·     SOAP 消息必须使用 SOAP Envelope 命名空间

·     SOAP 消息必须使用 SOAP Encoding 命名空间

·     SOAP 消息不能包含 DTD 引用

·     SOAP 消息不能包含 XML 处理指令

1.4   SOAP 消息的基本结构

<?xml version="1.0"?>      
<soap:Envelope      
xmlns:soap="http://www.w3.org/2001/12/soap-envelope"      
soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding">      
<soap:Header>      
...      
...      
</soap:Header>      
<soap:Body>      
...      
...      
<soap:Fault>      
...      
...      
</soap:Fault>      
</soap:Body>      
</soap:Envelope>      

1.5   SOAPHTTP Binding

SOAP 方法指的是遵守 SOAP 编码规则的 HTTP 请求/响应。

 

1.6   HTTP +XML = SOAP

SOAP 请求可能是 HTTP POST 或 HTTP GET 请求。

HTTP POST 请求规定至少两个 HTTP 头:Content-Type 和 Content-Length。

1.6.1     Content-Type

SOAP 的请求和响应的 Content-Type 头可定义消息的 MIME 类型,以及用于请求或响应的 XML 主体的字符编码(可选)。

语法:

Content-Type: MIMEType; charset=character-encoding      

例子:

POST /item HTTP/1.1      
Content-Type: application/soap+xml; charset=utf-8      

1.6.2   Content-Length

SOAP 的请求和响应的 Content-Length 头规定请求或响应主体的字节数。

语法

Content-Length: bytes      
例子      
POST /item HTTP/1.1      
Content-Type: application/soap+xml; charset=utf-8      
Content-Length: 250      

1.7      xmlns:soap 命名空间

SOAP 消息必须拥有与命名空间"http://www.w3.org/2001/12/soap-envelope" 相关联的一个 Envelope 元素。

如果使用了不同的命名空间,应用程序会发生错误,并抛弃此消息。

1.8      encodingStyle 属性

SOAP 的 encodingStyle 属性用于定义在文档中使用的数据类型。此属性可出现在任何 SOAP 元素中,并会被应用到元素的内容及元素的所有子元素上。SOAP

语法

soap:encodingStyle="URI"

1.9      可选的 SOAP Header 元素包含头部信息。

可选的 SOAPHeader 元素可包含有关 SOAP 消息的应用程序专用信息(比如认证、支付等)。如果 Header 元素被提供,则它必须是 Envelope 元素的第一个子元素。

1.10   actor 属性

通过沿着消息路径经过不同的端点,SOAP 消息可从某个发送者传播到某个接收者。并非 SOAP 消息的所有部分均打算传送到SOAP 消息的最终端点,不过,另一个方面,也许打算传送给消息路径上的一个或多个端点。

SOAP 的 actor 属性可被用于将 Header 元素寻址到一个特定的端点。

语法

soap:actor="URI"

<soap:Header>

<m:Trans

xmlns:m="http://www.w3school.com.cn/transaction/"

soap:actor="http://www.w3school.com.cn/appml/">

234

</m:Trans>

</soap:Header>

1.11   mustUnderstand 属性

SOAP 的 mustUnderstand 属性可用于标识标题项对于要对其进行处理的接收者来说是强制的还是可选的。

假如您向 Header 元素的某个子元素添加了"mustUnderstand="1",则它可指示处理此头部的接收者必须认可此元素。假如此接收者无法认可此元素,则在处理此头部时必须失效。

语法

soap:mustUnderstand="0|1"

1.12   SOAP Body 元素

必需的 SOAP Body 元素可包含打算传送到消息最终端点的实际 SOAP

1.13   SOAP Fault 元素

可选的 SOAP Fault元素用于存留 SOAP 消息的错误和状态信息。

SOAP Fault 元素

来自 SOAP 消息的错误消息被携带于 Fault 元素内部。

如果已提供了 Fault 元素,则它必须是 Body 元素的子元素。在一条 SOAP 消息中,Fault 元素只能出现一次。

SOAP 的 Fault 元素用于下列子元素:

子元素 描述
<faultcode> 供识别故障的代码
<faultstring> 可供人阅读的有关故障的说明
<faultactor> 有关是谁引发故障的信息
<detail> 存留涉及 Body 元素的应用程序专用错误信息

SOAP Fault Codes

在下面定义的faultcode 值必须用于描述故障时的faultcode 元素中:

错误 描述
VersionMismatch SOAP Envelope 元素的无效命名空间被发现
MustUnderstand Header 元素的一个直接子元素(带有设置为 "1" 的  mustUnderstand 属性)无法被理解。
Client 消息被不正确地构成,或包含了不正确的信息。
Server 服务器有问题,因此无法处理进行下去。

1.14   一个SOAP实例

在下面的例子中,一个 GetStockPrice 请求被发送到了服务器。此请求有一个 StockName 参数,而在响应中则会返回一个 Price 参数。此功能的命名空间被定义在此地址中:"http://www.example.org/stock"

SOAP 请求:

POST /InStock HTTP/1.1

Host: www.example.org

Content-Type: application/soap+xml;charset=utf-8

Content-Length: nnn

<?xmlversion="1.0"?>

<soap:Envelope

xmlns:soap="http://www.w3.org/2001/12/soap-envelope"

soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding">

<soap:Bodyxmlns:m="http://www.example.org/stock">

<m:GetStockPrice>

<m:StockName>IBM</m:StockName>

   </m:GetStockPrice>

</soap:Body>

</soap:Envelope>

SOAP 响应:

HTTP/1.1 200 OK

Content-Type: application/soap+xml;charset=utf-8

Content-Length: nnn

<?xmlversion="1.0"?>

<soap:Envelope

xmlns:soap="http://www.w3.org/2001/12/soap-envelope"

soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding">

<soap:Bodyxmlns:m="http://www.example.org/stock">

<m:GetStockPriceResponse>

<m:Price>34.5</m:Price>

</m:GetStockPriceResponse>

</soap:Body>

</soap:Envelope>

1.15

以上内容介绍了什么是soap消息。那么怎么使用soap消息?为什么要使用soap消息?soap消息有哪些优缺点?你知道吗?可以思考一下。

在我们的环境中,datasync用于同步数据入库,提供了soap接口访问环境,使用soapUI来发送soap消息。我们说使用到的soap消息,就是向服务器发送参数请求服务,然后得到服务器发回来的响应结果。这里提供服务的接口,我们称为soap接口,服务也称为webservice

2      WEB Service

2.1      web service?

Web Service也叫XML Web Service WebService是一种可以接收从Internet或者Intranet上的其它系统中传递过来的请求,轻量级的独立的通讯技术。是:通过SOAP在Web上提供的软件服务,使用WSDL文件进行说明,并通过UDDI进行注册。

XML:(Extensible Markup Language)扩展型可标记语言。面向短期的临时数据处理、面向万维网络,是Soap的基础。

Soap:(Simple Object Access Protocol)简单对象存取协议。是XML Web Service 的通信协议。当用户通过UDDI找到你的WSDL描述文档后,他通过可以SOAP调用你建立的Web服务中的一个或多个操作。SOAP是XML文档形式的调用方法的规范,它可以支持不同的底层接口,像HTTP(S)或者SMTP。

WSDL:(Web Services Description Language) WSDL 文件是一个 XML 文档,用于说明一组 SOAP 消息以及如何交换这些消息。大多数情况下由软件自动生成和使用。

UDDI (Universal Description, Discovery, andIntegration) 是一个主要针对Web服务供应商和使用者的新项目。在用户能够调用Web服务之前,必须确定这个服务内包含哪些商务方法,找到被调用的接口定义,还要在服务端来编制软件,UDDI是一种根据描述文档来引导系统查找相应服务的机制。UDDI利用SOAP消息机制(标准的XML/HTTP)来发布,编辑,浏览以及查找注册信息。它采用XML格式来封装各种不同类型的数据,并且发送到注册中心或者由注册中心来返回需要的数据。

2.2      web service的特点

Web Service的主要目标是跨平台的可互操作性。为了实现这一目标,Web Service 完全基于XML(可扩展标记语言)、XSD(XML Schema)等独立于平台、独立于软件供应商的标准,是创建可互操作的、分布式应用程序的新平台。因此使用Web Service有许多优点(具体请自己查询):

  • 跨防火墙的通信
  • 应用程序集成
  • B2B的集成
  • 软件和数据重用

2.3      XML Web Service的应用

1.最初的 XML Web Service 通常是可以方便地并入应用程序的信息来源,如股票价格、天气预报、体育成绩等等。

2.以 XML Web Service 方式提供现有应用程序,可以构建新的、更强大的应用程序,并利用 XML Web Service 作为构造块。

例如,用户可以开发一个采购应用程序,以自动获取来自不同供应商的价格信息,从而使用户可以选择供应商,提交订单,然后跟踪货物的运输,直至收到货物。而供应商的应用程序除了在Web上提供服务外,还可以使用XMLWeb Service检查客户的信用、收取货款,并与货运公司办理货运手续。

 

2.4      作者有话说

Web service相当于为跨平台跨语言的服务器和客户端提供了连接。让客户端可以调用服务端提供的服务而不必考虑是如何实现的,但要求服务端、客户端都支持soap、http等协议。

那么如何实现一个webservice呢?

3      WDSL

3.1      什么是 WSDL?

WSDL:(Web Services Description Language) Web Services的描述语言。WSDL 文件是一个 XML 文档,用于说明一组 SOAP 消息以及如何交换这些消息。大多数情况下由软件自动生成和使用。

·     WSDL 指网络服务描述语言

·     WSDL 使用 XML 编写

·     WSDL 是一种 XML 文档

·     WSDL 用于描述网络服务

·     WSDL 也可用于定位网络服务

·     WSDL 还不是 W3C 标准

WSDL文档仅仅是一个简单的XML文档,它包含一系列描述某个webservice的定义。 

3.2   WSDL 文档结构

WSDL 文档是利用这些主要的元素来描述某个 web service 的:

元素 定义
<portType> web service 执行的操作
<message> web service 使用的消息
<types> web service 使用的数据类型
<binding> web service 使用的通信协议
<service> web service 提供服务的地址

一个 WSDL 文档的主要结构是类似这样的:

<definitions>

<types>

   definition oftypes........

</types>

<message>

   definition ofa message....

</message>

<portType>

   definition ofa port.......

</portType>

<binding>

   definition ofa binding....

</binding>

<service>

   definition ofa service address....

</service>

</definitions>

WSDL 文档可包含其它的元素,比如 extension 元素,以及一个 service 元素,此元素可把若干个 web services 的定义组合在一个单一的 WSDL 文档中。 

3.3   WSDLtypes

<types>元素定义 web service 使用的数据类型。

为了最大程度的平台中立性,WSDL 使用 XML Schema 语法来定义数据类型。 类似于Java类中定义变量或者结构体。

3.4   WSDL 消息

<message>元素定义一个操作的数据元素。

每个消息均由一个或多个部件组成。类似于java中一个函数调用的参数。 

3.5   WSDL 端口

<portType>元素是最重要的 WSDL 元素。

它可描述一个 webservice、可被执行的操作,以及相关的消息。可以把 <portType> 元素比作传统编程语言中的一个函数库(或一个模块、或一个类)。 

3.6   WSDLBindings

<binding>

3.7   WSDLService

<service>

3.8   WSDL 文件实例参考

请参考enterprise部分。

<?xml version="1.0" encoding="UTF-8"?>
 <wsdl:definitions targetNamespace="​​​http://jilin.adapservice.pubbss.mobileoa.ccit.com​​​"
  xmlns:tns="​​​http://jilin.adapservice.pubbss.mobileoa.ccit.com​​​"
  xmlns:wsdlsoap="​​​http://schemas.xmlsoap.org/wsdl/soap/​​​" xmlns:soap12="​​http://www.w3.org/2003/05/soap-envelope​​​"
  xmlns:xsd="​​​http://www.w3.org/2001/XMLSchema​​​" xmlns:soapenc11="​​http://schemas.xmlsoap.org/soap/encoding/​​​"
  xmlns:soapenc12="​​​http://www.w3.org/2003/05/soap-encoding​​​" xmlns:soap11="​​http://schemas.xmlsoap.org/soap/envelope/​​​"
  xmlns:wsdl="​​​http://schemas.xmlsoap.org/wsdl/​​​">
  <wsdl:types>
   <xsd:schema xmlns:xsd="​​​http://www.w3.org/2001/XMLSchema​​​"
    attributeFormDefault="qualified" elementFormDefault="qualified"
    targetNamespace="​​​http://jilin.adapservice.pubbss.mobileoa.ccit.com​​​">   
    <xsd:complexType name="enterprises">
     <xsd:sequence>
      <xsd:element minOccurs="1" maxOccurs="1" name="optype"
       nillable="true" type="xsd:int" />
     </xsd:sequence>
    </xsd:complexType>   
    
    <xsd:element name="enterprises">
     <xsd:complexType>
      <xsd:sequence>
       <xsd:element minOccurs="1" maxOccurs="1" name="enterprises"
        nillable="true" type="tns:enterprises" />      
      </xsd:sequence>
     </xsd:complexType>
    </xsd:element>
    
    <xsd:complexType name="enterprisesResponse">
      <xsd:sequence>
       <xsd:element minOccurs="1" maxOccurs="1" name="retcode"
        nillable="true" type="xsd:string" />
       <xsd:element minOccurs="1" maxOccurs="1" name="retdesc"
        nillable="true" type="xsd:string" />
      </xsd:sequence>
    </xsd:complexType>
     
    <xsd:element name="enterprisesResponse">
     <xsd:complexType>
      <xsd:sequence>
       <xsd:element minOccurs="1" maxOccurs="1" name="response"
        nillable="true" type="tns:enterprisesResponse" />
      </xsd:sequence>
     </xsd:complexType>
    </xsd:element>
   </xsd:schema>
  </wsdl:types> <wsdl:message name="enterprisesRequest">
   <wsdl:part name="parameters" element="tns:enterprises">
   </wsdl:part>
  </wsdl:message>
  <wsdl:message name="enterprisesResponse">
   <wsdl:part name="parameters" element="tns:enterprisesResponse">
   </wsdl:part>
  </wsdl:message> <wsdl:portType name="standardPortType">
   <wsdl:operation name="enterprises">
    <wsdl:input name="enterprisesRequest" message="tns:enterprisesRequest">
    </wsdl:input>
    <wsdl:output name="enterprisesResponse" message="tns:enterprisesResponse">
    </wsdl:output>
   </wsdl:operation>
  </wsdl:portType>
  <wsdl:binding name="standardHttpBinding" type="tns:standardPortType">
   <wsdlsoap:binding style="document"
    transport="​​​http://schemas.xmlsoap.org/soap/http​​​" />
   <wsdl:operation name="enterprises">
    <wsdlsoap:operation soapAction="" />
    <wsdl:input name="enterprisesRequest">
     <wsdlsoap:body use="literal" />
    </wsdl:input>
    <wsdl:output name="enterprisesResponse">
     <wsdlsoap:body use="literal" />
    </wsdl:output>
   </wsdl:operation>
  </wsdl:binding>
  <wsdl:service name="standard">
   <wsdl:port name="standard" binding="tns:standardHttpBinding">
    <wsdlsoap:address
     location="​​​http://10.135.40.223:8666/pubbss/province/services/standard​​​" />
   </wsdl:port>
  </wsdl:service>
 </wsdl:definitions>      

3.9   WSDL 文件的使用

有了WSDL文件,但是怎么使用在代码中呢?很简单,只需要将WSDL文件转换成代码即可使用。通过如下两个java文件可以实现WSDL文件和JAVA文件之间的互转:

Axis14WSDL2Java.java Axis14Java2WSDL.java

3.10

WSDL文件和JAVA文件是相互对应的。我们可以根据已经写好的wsdl使用Axis14WSDL2Java.java 来自动生成java代码,在提供的*impl.java 中的接口处补充需要提供的服务的实现。

继续阅读