Web services详解 :入门必看 | WSDL、SOAP

概念

Web Service是基于网络的、分布式的模块化组件,通过 Web 进行发布、查找和使用**。**是应用程序组件使用开放协议进行通信, 是独立的(self-contained)并可自我描述, 可通过使用UDDI来发现,可被其他应用程序使用。

其实WebService就是一种跨编程语言和跨操作系统平台的远程调用技术(RPC的一种实现方式)

交互过程

Web Services 都是放在Web服务器(如IIS)的。

WebService服务器端首先要通过一个WSDL文件来说明自己有什么服务可以对外调用,并注册到UDDI服务器,以便被人查找。

客户根据 WSDL 描述文档,使用XML封装一个 SOAP 请求消息,嵌入在一个HTTP POST请求中,发送到 Web 服务器来。

Web 服务器再把这些请求转发给 Web Services 请求处理器。

由请求处理器解析收到的 SOAP 请求,调用 Web Services,然后再生成相应的 SOAP 应答。

Web 服务器得到 SOAP 应答后,会再通过 HTTP应答的方式把信息送回到客户端。

Web services 三种基本元素:

  • SOAP (简易对象访问协议)
  • UDDI (通用描述、发现及整合)
    • UDDI 是一种由 WSDL 描述的网络服务接口目录,通过它,企业可注册并搜索 Web services
    • UDDI是统一描述、发现和集成(Universal Description, Discovery, and Integration)的缩写。
    • 它是一个基于 XML 的跨平台的描述规范,可以使世界范围内的企业在互联网上发布自己所提供的服务。
    • UDDI 指通用的描述、发现以及整合(Universal Description, Discovery and Integration)。
    • UDDI 是一种用于存储有关 web services 的信息的目录。
    • UDDI 经由 SOAP 进行通迅。
    • UDDI 被构建于 Microsoft .NET 平台之中。
  • WSDL (Web services 描述语言)

SEI和CXF

SEI:WebService EndPoint Interface(终端,WebService的终端接口),就是WebService服务器端用来处理请求的接口;我们可以理解为是xxxWebService的各个xxxWebServiceImpl实现类
CXF:Celtix + XFire,一个apache的用于开发webservice服务器端和客户端的框架

WSDL

https://blog.csdn.net/wenzhi20102321/article/details/68486526

https://www.cnblogs.com/antLaddie/p/14968268.html

概念

WSDL (Web services 描述语言)

  • 是基于 XML 的用于描述 Web Services 以及如何访问 Web Services 的语言
  • WSDL 指网络服务描述语言
  • WSDL 使用 XML 编写
  • WSDL 是一种 XML 文档
  • WSDL 用于描述网络服务
  • WSDL 也可用于定位网络服务
  • WSDL 还不是 W3C 标准

WSDL文档结构

⼀个WSDL⽂档通常包含8个重要的元素,即definitions、types、import、message、portType、operation、binding、service元素。

元素定义
<portType>web service 执行的操作相当于一个controller,描述了一个个 web service接口信息,如接口是否有输入输出、使用哪个message作为输入输出、接口的描述信息等
<message>web service 使用的消息定义接口的输入输出参数,由一个或者多个 part (参数)组成。
<types>web service 使用的数据类型定义数据类型,它使用某种类型系统(如 XSD)
<binding>web service 使用的通信协议、消息传递样式、编码样式定义portType的消息格式和协议细节。<binding type="glossaryTerms" name="b1">type绑定一个portType,name为自定义名称,定义每个接口的soap;定义为绑定和网络地址组合的单个端点。
definitions封装整个WSDL文档
import导入其他WSDL文档,location为文档wsdl地址,namespace为指向的wsdl的命名空间
service和portservice包含可多个port,每个port表示一个web服务,port将url赋给某个binding,多个port可以将不同url指向同个binding
<portType>

portType使用operation描述一个个的操作(接口)。

Operation(操作)

WSDL定义了四种操作:

1.单向(one-way):仅服务端接收请求/消息;

2.请求-响应(request-response):服务端接收请求/消息,并响应相关消息;

3.要求-响应(solicit-response):服务端发送请求/消息,并等待接收一个响应;

4.通知(notification):仅服务端发送请求/消息。

示例1:接受一个newTermVa
lues类型的输入参数,没有输出
<message name="newTermValues">
  <part name="term" type="xs:string"/>
  <part name="value" type="xs:string"/>
</message>
<portType name="glossaryTerms">
  <operation name="setTerm">
    <input name="newTerm" message="newTermValues"/>
  </operation>
</portType >

示例2:接受一个getTermRequest类型的输入参数,输出一个getTermResponse类型参数
<message name="getTermRequest">
  <part name="term" type="xs:string"/>
</message> 
<message name="getTermResponse">
  <part name="value" type="xs:string"/>
</message> 
<portType name="glossaryTerms">
  <operation name="getTerm">
    <input message="getTermRequest"/>
    <output message="getTermResponse"/>
  </operation>
</portType>

还有两种操作类型:
Solicit-response	此操作可发送一个请求,并会等待一个响应。
Notification	此操作可发送一条消息,但不会等待响应。
<binding>

将⼀个抽象portType映射到⼀组具体协议(SOAO和HTTP)、消息传递样式、编码样式

binding 元素

两个属性:

  • name 属性(定义 binding 的名称)
  • type 属性(指向绑定的portType端口)
soap:binding 元素

两个属性:

  • style 属性可取值 “rpc” 或 “document”
  • transport 属性定义了要使用的 SOAP 协议。在这个例子中我们使用 HTTP。
operation 元素

定义了每个接口的 SOAP 行为、输入和输出编码等,在这个例子中我们使用了 "literal"编码

<binding type="glossaryTerms" name="b1">
    <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http" />
    <operation>
        <soap:operation     soapAction="http://example.com/getTerm" />
        <input>
          <soap:body use="literal" />
        </input>
        <output>
          <soap:body use="literal" />
        </output>
  </operation>
</binding>

<message name="getTermRequest">
   <part name="term" type="xs:string" />
</message>

<message name="getTermResponse">
   <part name="value" type="xs:string" />
</message>

<portType name="glossaryTerms">
  <operation name="getTerm">
      <input message="getTermRequest" />
      <output message="getTermResponse" />
  </operation>
</portType>

WSDL1.2语法示例

<!-- 定义wsdl名称、命名空间等,1、xmlns:xxx:引用,相当于Java里面的import;2、name:SEI定义名称;3、targetNamespace:命名空间,相当于Java里面的package -->
<wsdl:definitions name="nmtoken"? targetNamespace="uri">
    
	<!-- 导入其他WSDL文档,location为文档wsdl地址,namespace为指向的wsdl的命名空间 -->
    <import namespace="uri" location="uri"/> *
    
	<!-- documentation用于声明注释 -->
    <wsdl:documentation .... /> ?
    
	<!-- 定义数据类型 -->
    <wsdl:types> ?
        <wsdl:documentation .... /> ?
        <xs:schema>            
            <!--定义一个复杂类型,但此类型为空(就是说countAllStudent方法为空参数)-->
            <xs:complexType name="countAllStudent">
                <xs:sequence/>
            </xs:complexType>
        </xs:schema>
    </wsdl:types>

    <!-- 定义接口参数 -->
    <wsdl:message name="ncname"> *
        <wsdl:documentation .... /> ?
        <!-- element:引用指定的类型,类型在types中定义 -->
        <part name="ncname" element="qname"? type="qname"?/> *
    </wsdl:message>

    <!-- 接口集合 -->
    <wsdl:portType name="ncname"> *
        <wsdl:documentation .... /> ?
        
        <!-- 定义某接口的输入、输出、报错信息 -->
        <wsdl:operation name="ncname"> *
            <wsdl:documentation .... /> ?
            <wsdl:input message="qname"> ?
                <wsdl:documentation .... /> ?
            </wsdl:input>
            <wsdl:output message="qname"> ?
                <wsdl:documentation .... /> ?
            </wsdl:output>
            <wsdl:fault name="ncname" message="qname"> *
                <wsdl:documentation .... /> ?
            </wsdl:fault>
        </wsdl:operation>
    </wsdl:portType>

    <wsdl:serviceType name="ncname"> *
        <wsdl:portType name="qname"/> +
    </wsdl:serviceType>
    
	<!-- 将⼀个抽象portType映射到⼀组具体协议(SOAO和HTTP)、消息传递样式、编码样式,1、name:实现类名称;2、type:指定一个portType -->
    <wsdl:binding name="ncname" type="qname"> 
        <!-- 绑定什么类型的数据用来请求响应,style:绑定的数据是一个document(就是xml格式类型的请求响应) -->
    	<soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document"/>
        <wsdl:documentation .... /> ?
        <-- binding details --> *
        <!-- 用来指定SEI中的处理请求的方法,一般分为请求和响应,name:SEI实现类里的具体实现方法 -->
        <wsdl:operation name="ncname"> *
            <wsdl:documentation .... /> ?
            <-- binding details --> *
            <!-- 指定客户端请求和服务端响应过来的数据类型,use:定义类型literal(文本) -->
            <wsdl:input> ?
                <wsdl:documentation .... /> ?
                <-- binding details -->
            </wsdl:input>
            <wsdl:output> ?
                <wsdl:documentation .... /> ?
                <-- binding details --> *
            </wsdl:output>
            <wsdl:fault name="ncname"> *
                <wsdl:documentation .... /> ?
                <-- binding details --> *
            </wsdl:fault>
        </wsdl:operation>
    </wsdl:binding>

    <!-- 定义binding的部署信息 -->
    <wsdl:service name="ncname" serviceType="qname"> *
        <wsdl:documentation .... /> ?
                
    	<!-- 每个port指定一个SEI的实现类,绑定一个binding,表示一个Web服务,binding:引用具体的<binding/>标签,name:具体的实现类对象 -->
        <wsdl:port name="ncname" binding="qname"> *
            <wsdl:documentation .... /> ?
            	<-- address details -->
                <!-- 用来说明当前WebService的请求地址 -->    
                <soap:address location="xxx"/>
        </wsdl:port>
    </wsdl:service>

</wsdl:definitions>

图解

在这里插入图片描述

SOAP

概述

SOAP (简易对象访问协议)

  • SOAP 指简易对象访问协议
  • SOAP 是一种通信协议
  • SOAP 用于应用程序之间的通信
  • SOAP 是一种用于发送消息的格式
  • SOAP 被设计用来通过因特网进行通信
  • SOAP 独立于平台
  • SOAP 独立于语言
  • SOAP 基于 XML
  • SOAP 很简单并可扩展
  • SOAP 允许您绕过防火墙
  • SOAP 将作为 W3C 标准来发展

结构

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

  • 必需的 Envelope 元素,可把此 XML 文档标识为一条 SOAP 消息
  • 可选的 Header 元素,包含头部信息
  • 必需的 Body 元素,包含所有的调用和响应信息
  • 可选的 Fault 元素,提供有关在处理此消息所发生错误的信息
<?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>

语法规则

soap:encodingStyle

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

<soap:Header>

如果使用 Header 元素,则它必须是 Envelope 元素的第一个子元素。

<soap:Body>

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

<soap:Fault>

Fault 元素用于指示错误消息,使用时必须是 Body 元素的子元素。

在一条 SOAP 消息中,Fault 元素只能出现一次。

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

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

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

  • 3
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这是一个WSDL文档,用于描述一个Web服务。其中: - xmlns:xsd、xmlns:wsdl、xmlns:tns、xmlns:soap、xmlns:ns2、xmlns:ns1是命名空间定义。 - name属性指定了这个Web服务的名称为"CXFofTanJYService",targetNamespace属性指定了这个Web服务的命名空间为"http://dao.service.com/"。 - <wsdl:import>元素用于导入其他命名空间下的WSDL文档,location属性指定了这个WSDL文档的位置,namespace属性指定了这个WSDL文档的命名空间。 - <wsdl:binding>元素用于定义这个Web服务的具体绑定信息,name属性指定了绑定的名称为"CXFofTanJYServiceSoapBinding",type属性指定了这个绑定的类型为"ns1:UserService"。 - <soap:binding>元素用于定义SOAP协议的绑定信息,style属性指定了消息的格式为"document",transport属性指定了传输协议为"http://schemas.xmlsoap.org/soap/http"。 - <wsdl:operation>元素用于定义Web服务的操作,name属性指定了操作的名称为"CXFHelloTanJY"。 - <soap:operation>元素用于定义SOAP协议的操作信息,soapAction属性指定了SOAP操作的命名空间。 - <wsdl:input>元素用于定义Web服务的输入参数,name属性指定了参数的名称为"CXFHelloTanJY",<soap:body>元素用于指定参数的数据格式。 - <wsdl:output>元素用于定义Web服务的输出参数,name属性指定了参数的名称为"CXFHelloTanJYResponse",<soap:body>元素用于指定参数的数据格式。 - <wsdl:service>元素用于定义Web服务的服务信息,name属性指定了服务的名称为"CXFofTanJYService"。 - <wsdl:port>元素用于定义Web服务的端口信息,binding属性指定了端口绑定的名称为"tns:CXFofTanJYServiceSoapBinding",name属性指定了端口的名称为"CXFofTanJYPort",<soap:address>元素用于指定端口的访问地址。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值