学习 WebService 第二步:知识准备——WSDL文件解析

原文地址: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 ServicesayHello入口类型是请求/响应模式,请求消息是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>

上一篇:macOS 中 apache vhosts 配置备忘


下一篇:"Unchecked-Send"漏洞分析