webService wsdl文档解析

225 阅读2分钟

「这是我参与11月更文挑战的第13天,活动详情查看:2021最后一次更文挑战

wsdl

介绍

Web Service Description Language 网络服务描述语言.基于XML的语言,用于描述WebServices以及如何访问.

简而言之,教你怎么通过xml文档能够正确访问webService接口.

文档结构

利用主要的一些元素来描述webService

  • <portType>:webService执行的操作

    • 可以理解成一个service类,用于执行某些方法
  • <message>:webService使用的消息

    • 可以理解成函数调用的参数
  • <types>:webService 的数据类型

    • 数据类型
  • <binding>:webService 使用的通信协议

    • 协议细节

参考文档


    <definitions xmlns:wsu="<http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd>" xmlns:wsp="<http://www.w3.org/ns/ws-policy>" xmlns:wsp1_2="<http://schemas.xmlsoap.org/ws/2004/09/policy>" xmlns:wsam="<http://www.w3.org/2007/05/addressing/metadata>" xmlns:soap="<http://schemas.xmlsoap.org/wsdl/soap/>" xmlns:tns="<http://service.testweb.study.com/>" xmlns:xsd="<http://www.w3.org/2001/XMLSchema>" xmlns="<http://schemas.xmlsoap.org/wsdl/>" targetNamespace="<http://service.testweb.study.com/>" name="WebServiceImplService">
    <types>
    	<xsd:schema>
    		<xsd:import namespace="<http://service.testweb.study.com/>" schemaLocation="<http://localhost:8181/service/webService?xsd=1>"/>
    	</xsd:schema>
    </types>
    <message name="trans">
    	<part name="parameters" element="tns:trans"/>
    </message>
    <message name="transResponse">
    	<part name="parameters" element="tns:transResponse"/>
    </message>
    <portType name="WebServiceImpl">
    	<operation name="trans">
    		<input wsam:Action="<http://service.testweb.study.com/WebServiceImpl/transRequest>" message="tns:trans"/>
    		<output wsam:Action="<http://service.testweb.study.com/WebServiceImpl/transResponse>" message="tns:transResponse"/>
    	</operation>
    </portType>
    <binding name="WebServiceImplPortBinding" type="tns:WebServiceImpl">
    		<soap:binding transport="<http://schemas.xmlsoap.org/soap/http>" style="document"/>
    	<operation name="trans">
    		<soap:operation soapAction=""/>
    			<input>
    			<soap:body use="literal"/>
    			</input>
    			<output>
    				<soap:body use="literal"/>
    			</output>
    	</operation>
    </binding>
    <service name="WebServiceImplService">
    	<port name="WebServiceImplPort" binding="tns:WebServiceImplPortBinding">
    		<soap:address location="<http://localhost:8181/service/webService>"/>
    	</port>
    </service>
    </definitions>

definitions

定义文档中需要用到的各个xml元素的namespace缩写和关键属性指向的前缀

<definitions xmlns:wsu="<http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd>" 
xmlns:wsp="<http://www.w3.org/ns/ws-policy>" xmlns:wsp1_2="<http://schemas.xmlsoap.org/ws/2004/09/policy>" 
xmlns:wsam="<http://www.w3.org/2007/05/addressing/metadata>" xmlns:soap="<http://schemas.xmlsoap.org/wsdl/soap/>" 
xmlns:tns="<http://service.testweb.study.com/>" xmlns:xsd="<http://www.w3.org/2001/XMLSchema>" 
xmlns="<http://schemas.xmlsoap.org/wsdl/>" 
targetNamespace="<http://service.testweb.study.com/>" 
name="WebServiceImplService">

xmlns:tns="<http://service.testweb.study.com/>" 这东西不就是service所在目录的反路径吗?测试了一下,改变路径名,这边的也会随之改变,那么确实是相同的路径.

image.png

types:定义数据类型

demo中没有内容,截取其他的wsdl片段来讲解.

element:定义的一个复杂类型,包含一个字符串(type="s:string").作为参数传入部分(name="inputParam"),相对应的是出参

<wsdl:types>
	<s:schema elementFormDefault="qualified" targetNamespace="<http://tempuri.org/>">
		<s:element name="Hander">
			<s:complexType>
				<s:sequence>
					<s:element minOccurs="0" maxOccurs="1" name="inputParam" type="s:string"/>
				</s:sequence>
			</s:complexType>
		</s:element>
		<s:element name="HanderResponse">
			<s:complexType>
				<s:sequence>
		<s:element minOccurs="0" maxOccurs="1" name="HanderResult" type="s:string"/>
			</s:sequence>
			</s:complexType>
		</s:element>
	</s:schema>
</wsdl:types>

portType

portType:指的是WebServiceImpl类这个服务类,而operation指的是执行trans这个方法.input是入参.output是出参

image.png

<portType name="WebServiceImpl">
	<operation name="trans">
		<input wsam:Action="<http://service.testweb.study.com/WebServiceImpl/transRequest>" message="tns:trans"/>
		<output wsam:Action="<http://service.testweb.study.com/WebServiceImpl/transResponse>" message="tns:transResponse"/>
	</operation>
</portType>

上面的出入参的message指向了下面的两个元素.transtransResponse分别为入参合集和出参合集

<message name="trans">
	<part name="parameters" element="tns:trans"/>
</message>
<message name="transResponse">
	<part name="parameters" element="tns:transResponse"/>
</message>

binging:规定协议,格式等

binding 有两个属性,name和type.代表名称和指向用于binding的端口→WebServiceImpl

soap:binding 有两个属性,style和transport. style可取rpc或者document.

transport定义了使用的SOAP协议,在这里我们使用http协议.

对输入输出使用literal进行编码

<binding name="WebServiceImplPortBinding" type="tns:WebServiceImpl">
		<soap:binding transport="<http://schemas.xmlsoap.org/soap/http>" style="document"/>
	<operation name="trans">
		<soap:operation soapAction=""/>
			<input>
			<soap:body use="literal"/>
			</input>
			<output>
				<soap:body use="literal"/>
			</output>
	</operation>
</binding>