【WebService】第五章、WSDL文件详解
本章主要详细记录如何读懂一个WSDL描述文件。 ? ? ? 在上一章里面我们已经成功部署了一个WebService服务,并且通过浏览器能够顺利的看到WSDL文件。那么该文件 表示什么含义呢?通过这个文件我们该如何调用他呢? 1、先列出一份简单的wsdl<?xml version="1.0" encoding="UTF-8"?> <wsdl:definitions targetNamespace="http://www.ztesoft.com/axis/sayHello" xmlns:apachesoap="http://xml.apache.org/xml-soap" xmlns:impl="http://www.ztesoft.com/axis/sayHello" xmlns:intf="http://www.ztesoft.com/axis/sayHello" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <wsdl:message name="qryUserNameRequest"> <wsdl:part name="name" type="xsd:string" /> </wsdl:message> <wsdl:message name="qryUserNameResponse"> <wsdl:part name="qryUserNameReturn" type="xsd:string" /> </wsdl:message> <wsdl:portType name="HelloImpl"> <wsdl:operation name="qryUserName" parameterOrder="name"> <wsdl:input message="impl:qryUserNameRequest" name="qryUserNameRequest" /> <wsdl:output message="impl:qryUserNameResponse" name="qryUserNameResponse" /> </wsdl:operation> </wsdl:portType> <wsdl:binding name="SayHelloSoapBinding" type="impl:HelloImpl"> <wsdlsoap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http" /> <wsdl:operation name="qryUserName"> <wsdlsoap:operation soapAction="" /> <wsdl:input name="qryUserNameRequest"> <wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://www.ztesoft.com/axis/sayHello" use="encoded" /> </wsdl:input> <wsdl:output name="qryUserNameResponse"> <wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://www.ztesoft.com/axis/sayHello" use="encoded" /> </wsdl:output> </wsdl:operation> </wsdl:binding> <wsdl:service name="HelloImplService"> <wsdl:port binding="impl:SayHelloSoapBinding" name="SayHello"> <wsdlsoap:address location="http://127.0.0.1:8080/axis/services/SayHello" /> </wsdl:port> </wsdl:service> </wsdl:definitions> 2、描述一个wsdl需要从那些方面描述首先让我们想一想,如果你想告诉别人你的网络服务,最起码你要让别人知道那些信息,别人才能调用。 ? ? ? 1、服务的请求地址,最好多个服务绑定到一个地址上。传递参数时指明调用方法名就可以了。 ? ? ? 2、服务使用了什么协议传输数据,例如soap协议,或者http协议的get方法,或者http协议的post方式等。 ? ? ? 3、在这个地址中,有哪些可以操作的方法。方法入参是什么,出参是什么。例如出参是UserInfo复杂对象。 ? ? ? 4、针对上面的方法,详细描述入参或者出参的结构。例如UserInfo里面有哪些String类型的,那些int类型的等。 3、针对上面提出的要求,我们来看看wsdl文件内的内容。上面的wsdl文件由4个节点组成。首先根节点是wsdl:definitions表示这个是一个wsdl的定义文件。(文件从下往上看) ? ? ? 3.1、wsdl:definitions:根节点,表示里面的内容是用来描述webservice的,首先引入schema。这样就不能乱写了。 ? ? ? 3.2、wsdl:service:提供了一个地址,如果你想访问这个服务就调用这个地址就行了。 ? ? ? 3.3、wsdl:binding:服务的协议,例如使用了soap协议。 ? ? ? 3.4、wsdl:portType:具体的服务集合,有哪些方法可以操作。方法入参是什么,出参是什么。 ? ? ? 3.5、wsdl:message:消息的详细信息,详细描述了出参是什么,入参是什么。 4、我对wsdl的一些看法第一次看这个文档挺难理解的。如果你了解下面几个原因我想看着也许挺容易的。 ? ? ? 1、比较复杂的东西应该抽取出来复用。例如上面的wsdl:portType里面有方法入参和出参。之所以用wsdl:message抽 取出来作为一个节点描述入参和出参。不就是为了复用吗,如果写在一起有别的方法也用到这种类型入参或者出参。那岂 不是还要写一次。 ? ? ? 2、其实这个和配置servlet有些相似。servlet配置时配置如下 <servlet> <servlet-name>AxisServlet</servlet-name> <servlet-class>org.apache.axis.transport.http.AxisServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>AxisServlet</servlet-name> <url-pattern>/services/*</url-pattern> </servlet-mapping> ? ? ? 例如上面想把一个url和一个类对应起来,中间加了一个servlet-name节点做为中间连接点,为什么不直接把url和类映 射到一起呢?我想如果这样做,可能不合理,要是直接映射。那么多一个对应该类的请求就需要多写一次类的全名,例如 <servlet-mapping> <servlet-class>org.apache.axis.transport.http.AxisServlet</servlet-class> <url-pattern>/services/*</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-class>org.apache.axis.transport.http.AxisServlet</servlet-class> <url-pattern>/ws/*</url-pattern> </servlet-mapping>如果中间多出来一个步骤,使用别名来对应应该方便很多。以后更改类了,只要改一次就可以了,如果不是的话,那么岂 不是每一个都需要改。 ? ? ? 而这里呢?wsdl:service可以看成是url-pattern。wsdl:binding则相当于是servlet-name。wsdl:portType相当于servlet-class 这样看是不是容易了,而且还可以添加很多额外的信息。例如wsdl:binding还可以添加一些描述信息,例如使用什么协议。 5、上面文件的含义? ? ? 服务集合wsdl:service里面有个服务SayHello的访问地址是http://127.0.0.1:8080/axis/services/SayHello,这个服务的 使用协议(通过什么方式传输数据)是wsdl:binding描述的。并且通过他我们还可以找到具体实现类wsdl:portType,在这 个类中有哪些方法wsdl:operation,以及方法的详细入参(wsdl:input)出参(wsdl:output)。在wsdl:message中可以看 到参数的详细组成。 6、通过上面的wsdl文件,我们如何调用package com.ztesoft.axis.client; import javax.xml.namespace.QName; import org.apache.axis.client.Call; import org.apache.axis.client.Service; public class Client { public static void main(String[] args) throws Exception { // wsdlsoap:address 节点中的地址值。 String url = "http://127.0.0.1:8080/axis/services/SayHello"; Service service = new Service(); Call call = (Call) service.createCall(); call.setTargetEndpointAddress(url); // wsdl:portType 里面的操作方法。 call.setOperationName(new QName(url,"qryUserName")); // 根据描述传入一个String对象,因为可能有多个入参,所以使用Objct[] // 描述的返回参数是String, 强转String。 String result = (String) call.invoke(new Object[]{"Readiay"}); System.out.println(result);; } }? ? ? 上面就是使用axis提供的客户端简单调用一下,最后在控制台就简单的打印了处理后的东西。在后面的章节将详细说明 如何调用客户端的内容。此处先做一个简单说明。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |