加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

【WebService】第五章、WSDL文件详解

发布时间:2020-12-17 00:54:21 所属栏目:安全 来源:网络整理
导读:本章主要详细记录如何读懂一个WSDL描述文件。 ? ? ? 在上一章里面我们已经成功部署了一个WebService服务,并且通过浏览器能够顺利的看到WSDL文件。那么该文件 表示什么含义呢?通过这个文件我们该如何调用他呢? 1、先列出一份简单的wsdl ?xml version="1.0"

本章主要详细记录如何读懂一个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提供的客户端简单调用一下,最后在控制台就简单的打印了处理后的东西。在后面的章节将详细说明

如何调用客户端的内容。此处先做一个简单说明。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读