原文地址:https://www.cnblogs.com/yzw23333/p/7245104.html
Web service中一个 WSDL 对应一个 web service地址。
可以想象成一个商店,商店里面出售很多手机(portTypes),每个手机上有很多功能(opeations),每个功能对应很多输入和输出参数(message)
- 这里没有类,只有端口。portTypes
- 没有方法,只有端口里面的操作。opeations
- 没有参数,只有传递给端口中某个操作的消息。message
一、WSDL文件解析
xml文档第一句:
definitions--WSDL文档的根元素,该元素的属性指明了WSDL文档的名称name,
文档的目标名字空间targetNamespace,以及WSDL文档应用的名字空间的速记定义。
它指明了此WebService的名称为:HelloWorldService
<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions xmlns:ns1="http://schemas.xmlsoap.org/soap/http" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://test.demo1/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" name="HelloWorldService" targetNamespace="http://test.demo1/">
<wsdl:types>
<xs:schema xmlns:tns="http://test.demo1/" xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="unqualified" targetNamespace="http://test.demo1/" version="1.0">
这部分是数据类型的定义,其中为定义了两个元素的结构:
- sayHello(请求参数的类型): 将该元素定义为包含一个字符串string元素(arg0)的复合类型元素。
- sayHelloResponse(响应参数的类型): 将该元素定义为包含一个字符串string元素(return)的复合类型元素。
其中的name="arg0", name="return"中的“arg0”,“return”是可以指定的,因为HelloWorld输入输出参数都是使用的默认的参数名,所以生成的xml是这样子。
<xs:element name="sayHello" type="tns:sayHello"/>
<xs:element name="sayHelloResponse" type="tns:sayHelloResponse"/>
<xs:complexType name="sayHello">
<xs:sequence>
<xs:element minOccurs="0" name="arg0" type="xs:string"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="sayHelloResponse">
<xs:sequence>
<xs:element minOccurs="0" name="return" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:schema>
</wsdl:types>
其中的name="arg0", name="return"中的“arg0”,“return”是可以指定的,因为HelloWorld输入输出参数都是使用的默认的参数名,所以生成的xml是这样子。
如果HelloWorld接口中的方法修改成:
1 public @WebResult(name="responseResult")String sayHello(@WebParam(name="name")String name) ;也就是给输入参数与返回结果指定一个选定的名字,则生成的xml如下所示:
1 <xs:complexType name="sayHello">
2 <xs:sequence>
3 <xs:element minOccurs="0" name="name" type="xs:string"/>
4 </xs:sequence>
5 </xs:complexType>
6 <xs:complexType name="sayHelloResponse">
7 <xs:sequence>
8 <xs:element minOccurs="0" name="responseResult" type="xs:string"/>
9 </xs:sequence>
10 </xs:complexType>
下面这部分是消息格式的抽象定义,其中定义了两个消息格式:
- sayHelloResponse( 响应消息格式 ): 由一个消息片断组成,该消息片断的名字是parameters,包含的具体元素类型是sayHelloResponse。
- sayHello( 请求消息格式 ) : 由一个消息片断组成,该消息片断的名字是 parameters,包含的具体元素类型是sayHello。
<wsdl:message name="sayHelloResponse">
<wsdl:part element="tns:sayHelloResponse" name="parameters">
</wsdl:part>
</wsdl:message>
<wsdl:message name="sayHello">
<wsdl:part element="tns:sayHello" name="parameters">
</wsdl:part>
</wsdl:message>
portType---描述服务逻辑接口的operation元素的集合。HelloWorld只有一个操作sayHello.
这部分定义了服务访问点的调用模式的类型,表明 HelloWorld Service的sayHello入口类型是请求/响应模式,请求消息是sayHello,而响应消息是sayHelloResponse。
<wsdl:portType name="HelloWorld">
<wsdl:operation name="sayHello">
<wsdl:input message="tns:sayHello" name="sayHello">
</wsdl:input>
<wsdl:output message="tns:sayHelloResponse" name="sayHelloResponse">
</wsdl:output>
</wsdl:operation>
</wsdl:portType>
binding---一个endpoint的实际数据格式说明,一个binding元素定义如何将一个抽象消息映射到一个具体数据格式。该元素指明诸如参数顺序,返回值等信息。
每个被支持的信息格式和信息传送方式组合,就叫做 binding (soap:binding 就是用 soap语言通话 )
这段xml定义的操作“sayHello”使用的是SoapDocumentProtocol消息格式(style="document")。输入和输出参数格式都是“Literal”(use="literal")
<wsdl:binding name="HelloWorldServiceSoapBinding" type="tns:HelloWorld">
<soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
<wsdl:operation name="sayHello">
<soap:operation soapAction="" style="document"/>
<wsdl:input name="sayHello">
<soap:body use="literal"/>
</wsdl:input>
<wsdl:output name="sayHelloResponse">
<soap:body use="literal"/>
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
找到名为“HelloWorldService”的service具体定义如下所示:
service---相关port元素的集合,用户组织endpoint定义。
port--通过binding和物理地址定义的endpoint,这个元素将所有抽象定义聚集在一起。
这部分是具体的Web服务的定义,在这个名为 HelloWorldService的Web服务中,
提供了一个服务访问入口,访问地址是"http://localhost:8080/helloWorld",
使用的消息模式是由前面的binding “HelloWorldServiceSoapBindin”所定义的。
<wsdl:service name="HelloWorldService">
<wsdl:port binding="tns:HelloWorldServiceSoapBinding" name="HelloWorldPort">
<soap:address location="http://localhost:8080/helloWorld"/>
</wsdl:port>
</wsdl:service>
</wsdl:definitions>
二、请求及响应的具体消息格式解析
请求消息
- <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:q0="http://test.demo1/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
- <soapenv:Body>
- <q0:sayHello>
<arg0>xxl</arg0>
</q0:sayHello>
</soapenv:Body>
</soapenv:Envelope>
响应消息
- <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
- <soap:Body>
- <sayHelloResponse xmlns:ns2="http://test.demo1/">
<return>hello xxl</return>
</sayHelloResponse>
</soap:Body>
</soap:Envelope>