一、WSDL详解
1.wsdl是一个用于精确描述Web服务的文档,是一个遵循wsdl-xml模式的xml文档。
2.一个wsdl文档通常包括8个重要元素,即definitions、types、import、message、portType、operation、binding、service元素。
3.这些元素嵌套在definitions元素中,definitions是wsdl文档中的根文档。
WSDL 服务进行交互的基本元素:
Types(消息类型):数据类型定义的容器,它使用某种类型系统(如 XSD)。
Message(消息):通信数据的抽象类型化定义,它由一个或者多个 part 组成。
Part:消息参数
PortType(端口类型):特定端口类型的具体协议和数据格式规范。,它由一个或者多个 Operation组成。
Operation(操作):对服务所支持的操作进行抽象描述,WSDL定义了四种操作:
1.单向(one-way):端点接受信息;
2.要求-响应(solicit-response):端点发送消息,然后接受相关消息;
3.通知(notification[2] ):端点发送消息。
(一) definitions元素
所有的wsdl文档的根元素都是definitions元素,该元素封装了整个文档,同时通过其name提供了一个wsdl文档。除了提供一个命名空间targetNamespace之外,该元素没有其他作用。
(二)types元素
types元素作为一个容器,用于定义xml模式内置类型中没有描述的各种数据类型。当声明消息部分的有效时,消息定义使用了types元素中定义的数据类型和元素。
例如上面的例子:
该部分定义了两个元素,SendMessageInfo和SendMessageInfoResponse
SendMessageInfo:定义了一个复杂类型,仅仅包含两个简单的字符串messageCode和inputContent,用于操作的参数传入。并指明了参数的数据类型。
SendMessageInfoResponse:定义了一个复杂类型,包含了一个简单的字符串,用于描述操作的返回值,并指明返回结果数据类型。
(三)import元素
import元素可以在当前的WSDL文档中使用其他WSDL文档中指定的命名空间中的元素。
通常用于模块化WSDL文档。
必须有namespace属性和location属性:
1.namespace属性:值必须与正导入的WSDL文档中生命的targetNameSpace相匹配。
2.location属性:必须执行一个实际的WSDL文档,并且该文档不能为空
import格式如下:
<wsdl:import namespace="http://xxx.xxx.xxx/xxx/xxx" location="http://xxx.xxx.xxx/xxx/xxx.wsdl"/>
(四)message元素
message元素描述了Web服务使用消息的有效负载。message元素可以描述输出或者接受消息的有效负载。还可以描述SOAP文件头和错误detail元素的内容。定义message元素的方式取决于使用RPC样式还是文档样式的消息传递。
在文本中的message元素的定义,本文档使用了采用文档样式的消息传递:
该例子定义了两个消息,SendMessageInfoSoapIn和SendMessageInfoSoapOut
SendMessageInfo:
是请求操作格式,由一个消息片段组成,名字为parameters,元素为 types中的SendMessageInfo。
SendMessageInfoResponse:
SendMessageInfo的相应消息格式,由一个消息片段组成,名为parameters,元素为types中的SendMessageInfoResponse。
如果采用RPC样式消息传递,只需要将文档中的element元素修改为type即可。
(五)portType元素
portType元素定义了Web服务的抽象接口。该接口有点类似Java的接口,都是定义了一个抽象类型和方法,没有定义实现。在WSDL中,portType元素是由binding和service元素来实现的,这两个元素用来说明Web服务实现使用的Internet协议、编码方案、以及Internet地址。
一个portType中可以定义多个operation,一个operation可以看作是一个方法。
例如上面这个例子:
包含了一个操作SendMessageInfo方法,同时包含了input和output表明该操作是一个请求/响应模式,请求消息是前面定义的SendMessageInfoSoapIn,响应消息是SendMessageInfoSoapOut。
input标识传递到Web服务的有效负载,output标识传递给客户的有效负载。
这个例子相当于抽象类中定义了一个抽象方法SendMessageInfo,方法的参数的定义和返回值都定义在了types中,方法名的定义定义在了message中。
(六)binding
binding元素将portType映射到一组具体协议(SOAP和HTTP),消息传递样式、编码样式。通常binding元素与协议转悠的元素和在一起使用。
这部分将服务访问节点的抽象定义与SOAP、HTTP绑定,描述如何通过SOAP/HTTP来访问按照前面描述的访问入口点类型部署得访问入口。
其中规定了在具体SOAP调用时,应当使用的soapAction,这个Action在WebService代码调用中是很重要的。具体的使用需要参考特定的协议定义的元素。
(七)service元素和port元素
service元素包含一个或者多个port元素,其中每个port元素表示一个不同的Web服务。port元素将URL赋给一个特定的binding,甚至可以使两个或者多个port元素将不同的URL赋值给相同的binding。
引用图解:
2、 远程调用WebService
解析获得服务地址里面的方法和参数。
根据方法和参数进行远程调用访问:
创建Servce,根据service获取call对象,传入webservice链接,方法和参数,以及返回类型,使用invoke方法进行远程访问。
service.createCall();:创建call对象call.setTargetEndpointAddress(endpoint);:传入访问路径call.setOperationName("SendMessageInfo")传入方法名,根据WSDL解析获得call.addParameter("messageCode", XMLType.XSD_STRING,javax.xml.rpc.ParameterMode.IN);:传入接口参数以及返回值类型String result = (String) call.invoke(new Object[]{input1,input2});:远程访问webservce接口接收返回数据result。