怎样向别人介绍WS的功能呢?一般咱们会写接口文档,亦或口头告诉使用的人。这些方式都存在问题:其中一个我上篇中说过,客户端是无法直接使用服务端接口的;二是程序员在电脑前,想使用WS时,他们的工具(如Eclipse、VS)无法提供任何帮助,因为这些工具根本不了解你的WS。解决方案就是定义一套人和电脑都能阅读的规范或文档,因此WSDL首当其冲,你可以把WSDL理解成既是文档,又是代码。它基于XML语言,用来描述WS及其方法、参数、返回值。下面是我上篇发布的WSDL文档:

<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表示返回值。

4.binding:指明传递消息所用的格式。定义消息应该以什么样的形式呈现给用户,有两种形式:document和RPC,用的最多的是document,关于二者区别请点击。确定展现形式后,那用什么方式进行传递呢,有两种:literal和encoded,前者是通过XML方式传递,后者通过RMI的方式来访问,因为jdk6之前是不能用jax进行访问的,只能通过RMI。

5.service:指定服务所发布的名称。需要注意的是服务的名称和上面definitions的名称是一致的,port的名称就是绑定服务的名称。

消息传递

讲完了上面这些,下面我们来简单的看一下消息是如何传递的,查看消息的传递,有很多工具Eclipse、TCPMON等,这里重点说下TCPMon,Eclipse大家可上网找相关资料。

TCPMON下载地址:http://ishare.iask.sina.com.cn/f/23935605.html

TCPMON主要是拦截服务器和客户端之前的请求响应,他做一个中转站,让一切消息都经过他,因此我们在它里面就可以看到请求和响应的消息体了。运行tcpmon.bat批处理文件,可看到如下界面:

将服务器端发布的端口改为7777,客户端为8888,启动服务,然后运行客户端,你就可以看到下图:

消息包括消息头和消息体,现在只关注消息体,后续会讲解消息头内容,从上图消息格式中可以看出,他和http://localhost:8888/ws?xsd=1中的元素是一一对应的。

下篇开始讲SOAP。

Webservice-WSDL详解(三)的更多相关文章

  1. .NET DLL 保护措施详解(三)最终效果

    针对.NET DLL 保护措施详解所述思路完成最终的实现,以下为程序包下载地址 下载 注意: 运行环境为.net4.0,需要安装VS2015 C++可发行组件包vc_redist.x86.exe.然后 ...

  2. Android 之窗口小部件详解(三)  部分转载

    原文地址:http://blog.csdn.net/iefreer/article/details/4626274. (一) 应用程序窗口小部件App Widgets 应用程序窗口小部件(Widget ...

  3. WebSocket安卓客户端实现详解(三)–服务端主动通知

    WebSocket安卓客户端实现详解(三)–服务端主动通知 本篇依旧是接着上一篇继续扩展,还没看过之前博客的小伙伴,这里附上前几篇地址 WebSocket安卓客户端实现详解(一)–连接建立与重连 We ...

  4. logback -- 配置详解 -- 三 -- <encoder>

    附: logback.xml实例 logback -- 配置详解 -- 一 -- <configuration>及子节点 logback -- 配置详解 -- 二 -- <appen ...

  5. python设计模式之装饰器详解(三)

    python的装饰器使用是python语言一个非常重要的部分,装饰器是程序设计模式中装饰模式的具体化,python提供了特殊的语法糖可以非常方便的实现装饰模式. 系列文章 python设计模式之单例模 ...

  6. Python操作redis字符串(String)详解 (三)

    # -*- coding: utf-8 -*- import redis #这个redis不能用,请根据自己的需要修改 r =redis.Redis(host=") 1.SET 命令用于设置 ...

  7. pika详解(三)SelectConnection及其他Connection

    pika详解(三)SelectConnection及其他Connection   本文链接:https://blog.csdn.net/comprel/article/details/94661147 ...

  8. View绘制详解(三),扒一扒View的测量过程

    所有东西都是难者不会,会者不难,Android开发中有很多小伙伴觉得自定义View和事件分发或者Binder机制等是难点,其实不然,如果静下心来花点时间把这几个技术点都研究一遍,你会发现其实这些东西都 ...

  9. Android WebView 开发详解(三)

    转载请注明出处   http://blog.csdn.net/typename/article/details/40302351 powered by miechal zhao 概览 Android ...

  10. KeilC51使用详解 (三)

    C51强大功能及其高效率的重要体现之一在于其丰富的可直接调用的库函数,多使用库函数使程序代码简单,结构清晰,易于调试和维护,下面介绍C51的库函数系统. 第一节 本征库函数(intrinsic rou ...

随机推荐

  1. IM与工作信息流整合

    IM与工作信息流整合,希望减轻用户“信息”负担   从36氪此前的<“明道”现在推出个人免费版本,是怎样的逻辑?>一 文中,我们可以了解到,国内现在的协作产品设计思路主要有两种:一种是像t ...

  2. 基于Visual C++2013拆解世界五百强面试题--题6-double类型逆序

    请设计一个函数,不许用到字符串函数,用数学运算,将double类型数据转换,例如123.456转换成654.321 首先想到依次提取他的每一个位数,然后进行运算,移动每一位数到相应位置,结果相加就能逆 ...

  3. c#简单的调试信息、日志信息输出

    public static void ErrorLog(string mssg) { string FilePath = "D:/logs/ErrorLog.txt"; try { ...

  4. c 输入两个数,第一个数决定一个nXn的矩阵,第二个数决定从1开始赋值,赋值的上限 (MD花了半天时间,思路不对害死人)

    输入两个数,第一个数决定一个nXn的矩阵,第二个数决定从1开始赋值,赋值的上限 比如: 输入: 输出: 输入: 输出: #include<stdio.h> int main(void) { ...

  5. ASP.NET 母版页和内容页的加载顺序

    Master 模板页Content 内容页如果希望Master页面的数据传给Content页面,请Init如果希望Content页面的数据传给Master页面,请重载Load具体细节不多说了,看下面页 ...

  6. iOS开发之第三方登录QQ -- 史上最全最新第三方登录QQ方式实现

    项目地址 :  https://github.com/zhonggaorong/QQLoginDemo/tree/master 最新版本的qq登录实现步骤实现: 1. 首先,你需要去向腾讯申请账号. ...

  7. python编写工具及配置(notepad++)

    学长跟我说老师实验室里用的ide是pycharm,我用了一天,整体还行,就是加载速度太慢,可是第二天用的时候就卡的想让人骂街,cpu占有率趋近100%,电脑配置不高,我寻思不能因为这个就马上换电脑吧, ...

  8. BZOJ 1669: [Usaco2006 Oct]Hungry Cows饥饿的奶牛( LIS )

    裸的LIS ----------------------------------------------------------------- #include<cstdio> #incl ...

  9. spoj 3871 gcd extreme

    题目大意给出一个n,求sum(gcd(i,j),<i<j<=n); 可以明显的看出来s[n]=s[n-]+f[n]; f[n]=sum(gcd(i,n),<i<n); 现 ...

  10. 转: 模块化开发框架seajs简介

    JavaScript模块化开发库之SeaJSSeaJS由国内的牛人lifesinger开发.目前版本是1.1.1,源码不到1500行,压缩后才4k,质量极高.这篇会讲述SeaJS的一些基本用法,不会面 ...