怎样向别人介绍WS的功能呢?通常我们会写接口文档,亦或口头告诉使用的人。这些方式都存在问题:其中一个我上篇中说过,客户端是没法直接使用服务端接口的;二是程序员在电脑前,想使用WS时,他们的工具(如Eclipse、VS)没法提供任何帮助,由于这些工具根本不了解你的WS。解决方案就是定义一套人和电脑都能阅读的规范或文档,所以WSDL首当其冲,你能够把WSDL理解成既是文档,又是代码。它基于XML语言,用来描述WS及其方法、参数、返回值。下面是我上篇发布的WSDL文档:html
<definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://service.easyway.net.cn/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://schemas.xmlsoap.org/wsdl/" targetNamespace="http://service.easyway.net.cn/" name="MyServiceImplService"> <types> <xsd:schema> <xsd:import namespace="http://service.easyway.net.cn/" schemaLocation="http://localhost:8888/ws?xsd=1"/> </xsd:schema> </types> <message name="login"> <part name="parameters" element="tns:login"/> </message> <message name="loginResponse"> <part name="parameters" element="tns:loginResponse"/> </message> <portType name="IMyService"> <operation name="login"> <input message="tns:login"/> <output message="tns:loginResponse"/> </operation> </portType> <binding name="MyServiceImplPortBinding" type="tns:IMyService"> <soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document"/> <operation name="login"> <soap:operation soapAction=""/> <input> <soap:body use="literal"/> </input> <output> <soap:body use="literal"/> </output> </operation> </binding> <service name="MyServiceImplService"> <port name="MyServiceImplPort" binding="tns:MyServiceImplPortBinding"> <soap:address location="http://localhost:8888/ws"/> </port> </service> </definitions>
WSDL为了描述服务、方法等,咱们关注的点有五大部分:types、message、portType、binding、service,下面将一一说明每一个节点。程序员
1.types:用来定义访问的数据类型。这个类型是有谁生成的呢?请看上面代码第4行的schemaLocation属性,把http://localhost:8888/ws?xsd=1拷贝到浏览器,回车,就会出现以下文档:浏览器
<xs:schema xmlns:tns="http://service.easyway.net.cn/" xmlns:xs="http://www.w3.org/2001/XMLSchema" version="1.0" targetNamespace="http://service.easyway.net.cn/"> <xs:element name="login" type="tns:login"/> <xs:element name="loginResponse" type="tns:loginResponse"/> <xs:complexType name="login"> <xs:sequence> <xs:element name="username" type="xs:string" minOccurs="0"/> <xs:element name="password" type="xs:string" minOccurs="0"/> </xs:sequence> </xs:complexType> <xs:complexType name="loginResponse"> <xs:sequence> <xs:element name="loginUser" type="tns:user" minOccurs="0"/> </xs:sequence> </xs:complexType> <xs:complexType name="user"> <xs:sequence> <xs:element name="id" type="xs:int"/> <xs:element name="password" type="xs:string" minOccurs="0"/> <xs:element name="username" type="xs:string" minOccurs="0"/> </xs:sequence> </xs:complexType> </xs:schema>
从上面文档中看出,有两个元素分别是login和loginResponse,也就是参数和返回值,而且里面详细的定义了方法参数以及返回值的具体类型,直到基本类型(type),所以,能够看出,不管是多么复杂的数据结构,用这种方式均可以用基本类型的方式表现出来。服务器
2.message:定义好数据类型后,咱们就要存储这种信息,而且传递,存储这个信息的叫作SOAP(Simple Object Access Protocol,关于SOAP后面会重点讲),这个消息就叫作SOAPMessage,传递就是经过SOAP协议来传递的。通常有多少个方法通常就会产生二倍的消息,是由于参数须要一个消息,返回值也须要一个消息,能够继续看上面wsdl的文档,message有login和loginResponse两个,一个是用来传递参数,一个是用来传递返回值。到此时,咱们就把把消息和元素对应起来了。数据结构
3.portType:定义好消息后,要在服务器端指明哪一个接口对它进行操做,也就是指明接口名称,而且要指明接口中有哪些方法,你们可观察上面的wsdl文档,operation就是绑定该接口有哪些方法(login),input表示方法参数,output表示返回值。tcp
4.binding:指明传递消息所用的格式。定义消息应该以什么样的形式呈现给用户,有两种形式:document和RPC,用的最多的是document,关于两者区别请点击。肯定展示形式后,那用什么方式进行传递呢,有两种:literal和encoded,前者是经过XML方式传递,后者经过RMI的方式来访问,由于jdk6以前是不能用jax进行访问的,只能经过RMI。工具
5.service:指定服务所发布的名称。须要注意的是服务的名称和上面definitions的名称是一致的,port的名称就是绑定服务的名称。spa
消息传递.net
讲完了上面这些,下面咱们来简单的看一下消息是如何传递的,查看消息的传递,有不少工具Eclipse、TCPMON等,这里重点说下TCPMon,Eclipse你们可上网找相关资料。3d
TCPMON下载地址:http://ishare.iask.sina.com.cn/f/23935605.html;
TCPMON主要是拦截服务器和客户端以前的请求响应,他作一个中转站,让一切消息都通过他,所以咱们在它里面就能够看到请求和响应的消息体了。运行tcpmon.bat批处理文件,可看到以下界面:
将服务器端发布的端口改成7777,客户端为8888,启动服务,而后运行客户端,你就能够看到下图:
消息包括消息头和消息体,如今只关注消息体,后续会讲解消息头内容,从上图消息格式中能够看出,他和http://localhost:8888/ws?xsd=1中的元素是一一对应的。
下篇开始讲SOAP。