WSDL
Web Service 描述语言 (WSDL) 是基于可扩展标记语言 (XML) 的描述语言。此语言作为描述 Web Service 的业界标准,提交到万维网联盟 (W3C)。WSDL 的功能源自两个主要体系结构原则:描述一组业务操作的能力以及将描述分隔为两个基本单元的能力。这些单元是操作的描述以及如何打包操作及其关联信息的详细信息。
WSDL 文档将服务定义为网络端点或端口的集合。在 WSDL 中,端点和消息的抽象定义与其具体网络部署或数据格式绑定分开。此分隔支持重用抽象 definitions: 消息,它是所交换数据的抽象描述,以及端口类型,它是操作的抽象集合。特殊端口类型的具体协议和数据格式规范组成可再用的绑定。端口是通过把网络地址与可再用绑定关联而定义的,而端口的集合定义服务。因此,WSDL 文档由几个元素组成。
以下是 WSDL 文件中信息的结构:
- Web Service 接口定义
该部分包含元素和名称空间。
- Web Service 实现
该部分包含服务和端口的定义。
WSDL 文件描述了带有下列元素的 Web Service:
portType
操作和其相关消息的描述。 portType 元素定义抽象操作。
<portType name="EightBall">
<operation name="getAnswer">
<input message="ebs:IngetAnswerRequest"/>
<output message="ebs:OutgetAnswerResponse"/>
</operation>
</portType>
message
输入和输出参数及返回值的描述。
<message name="IngetAnswerRequest">
<part name="meth1_inType" type="ebs:questionType"/>
</message>
<message name="OutgetAnswerResponse">
<part name="meth1_outType" type="ebs:answerType"/>
</message>
类型
描述消息中使用的 XML 类型的模式。
<types>
<xsd:schema targetNamespace="...">
<xsd:complexType name="questionType">
<xsd:element name="question" type="string"/>
</xsd:complexType>
<xsd:complexType name="answerType">
...
</types>
binding
binding 描述用于访问 portType 的协议,以及由特定 portType 元素定义的消息的数据格式。
<binding name="EightBallBinding" type="ebs:EightBall">
<soap:binding style="rpc" transport="schemas.xmlsoap.org/soap/http">
<operation name="ebs:getAnswer">
<soap:operation soapAction="urn:EightBall"/>
<input>
<soap:body namespace="urn:EightBall" ... />
...
服务
service 和 port 定义 Web Service 的位置。
Service 包含 Web Service 的名称和端口的列表。端口
port 包含 Web Service 的位置和用于此 Service 访问的绑定。<service name="EightBall">
<port binding="ebs:EightBallBinding" name="EightBallPort">
<soap:address location="localhost:8080/axis/EightBall"/>
</port>
</service>
如果要创建 Java™ API for XML Web Services (JAX-WS) 或 Java API for XML-based RPC (JAX-RPC) Web Service,那么从 JavaBeans 或企业 Bean 着手时可以使用自底向上式开发方法,或者从现有 Web Service 描述语言 (WSDL) 文件着手时可以使用自顶向下式开发方法。
当创建此产品的 JAX-WS Web Service 时,可以从 WSDL 或实现 Bean 类开始。如果从实现 Bean 类开始,那么使用 wsgen 命令行工具来生成所有 Web Service 服务器工件,包括 WSDL(如果请求的话)。如果从 WSDL 开始,那么使用 wsimport 命令行工具来生成服务器端或客户机端的所有 Web Service 工件。
当创建此产品的 JAX-RPC Web Service 时,您首先必须有包含服务端点接口的实现 Bean。然后您使用 Java2WSDL 命令行工具创建定义 Web Service 的 WSDL 文件。如果启动 WSDL 来生成实现 Bean 类,那么对 WSDL 文件运行 WSDL2Java 命令行工具以创建 Java API 和部署描述符模板。
多重部件 WSDL 和 WSDL 发布
该产品支持使用多重部件 Web Service 描述语言 (WSDL)文件部署 Web Service。在多重部件 WSDL 文件中,实现 WSDL 文件包含 wsdl:service。此实现 WSDL 文件导入接口 WSDL 文件,后者包含其他 WSDL 构造。这种多部件 WSDL 支持多个 Web Service 使用同一个 WSDL 接口定义。
<wsdl:import> 元素表明对另一个 WSDL 文件的引用。如果 <wsdl:import> 元素的位置属性未包含 URL,即,仅包含文件名,并未以 http://、https:// 或 file:// 开始,那么导入与被导入的文件必须位于同一目录而且不能包含相对路径成分。例如,如果 META-INF/wsdl/A_Impl.wsdl 在模块中并包含 import 语句 <wsdl:import="A.wsdl" namespace="..."/> ,则 A.wsdl 文件必须也位于模块 META-INF/wsdl 目录中。
建议将所有的 WSDL 文件放在 META-INF/wsdl 目录中(如果您正使用 Enterprise JavaBeans (EJB)),或者放在 WEB-INF/wsdl 目录中(如果您正使用 JavaBeans 组件),即使相关的导入文件位于 WSDL 文件中。否则,当您使用类似于 <location="../interfaces/A_Interface.wsdl"namespace="..."/> 的路径时,会给 WSDL 发布造成影响。使用这样的路径会由于相对路径的存在而失败,无论文件是否位于该路径。如果位置是 Web 地址,它必须在部署和服务器启动时都可读。
可以通过 URL 地址或文件发布位于 META-INF/wsdl 或 WEB-INF/wsdl 目录中的文件,包括 WSDL 或 XML 模式定义 (XSD) 文件。例如,如果在 webservices.xml 部署描述符的 <wsdl-file> 元素里引用的文件位于 META-INF/wsdl 或 WEB-INF/wsdl 目录中,则它是可发布的。如果由 <wsdl-file> 导入的文件位于 wsdl/ 目录或其子目录下,则他们是可发布的。
如果由 <wsdl-file> 元素引用的 WSDL 文件所在的目录不是 wsdl 目录或其子目录,则安装应用程序时,此文件和同一目录中的其导入文件(WSDL 或 XSD 文件)将不作修改而复制到 wsdl 目录。这些类型的文件也可以被发布。
如果 <wsdl-file> 导入位于其他目录(非 -INF/wsdl 目录或非其子目录)中的文件,则此文件不会复制到 wsdl 目录并且不可发布。
对于 JAX-WS Web Service,可以使用一个注释来指定 WSDL 的位置。使用带有 WSDLLocation 属性的 @WebService 注释。WSDLLocation 属性是可选的。如果未指定此属性,那么就根据在 Web Service 类找到的信息来生成和发布 WSDL。您可以选择性地在 webservices.xml 部署描述符中指定 WSDL 文件的位置。 无论如何,您在 webservices.xml 部署描述符中定义的任何信息将覆盖由注释指定的任何相应信息。