• Webservice-WSDL详解(三)


    怎样向别人介绍WS的功能呢?一般咱们会写接口文档,亦或口头告诉使用的人。这些方式都存在问题:其中一个我上篇中说过,客户端是无法直接使用服务端接口的;二是程序员在电脑前,想使用WS时,他们的工具(如EclipseVS)无法提供任何帮助,因为这些工具根本不了解你的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为了描述服务、方法等,我们关注的点有五大部分:typesmessageportTypebindingservice,下面将一一说明每个节点。

    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>

    从上面文档中看出,有两个元素分别是loginloginResponse,也就是方法名和返回值,并且里面详细的定义了方法参数以及返回值的具体类型,直到基本类型(type),因此,可以看出,不论是多么复杂的数据结构,用这种方式都可以用基本类型的方式表现出来。

    2.message:定义好数据类型后,我们就要存储这种信息,并且传递,存储这个信息的叫做SOAPSimple Object Access Protocol,关于SOAP后面会重点讲),这个消息就叫做SOAPMessage,传递就是通过SOAP协议来传递的。一般有多少个方法一般就会产生二倍的消息,是因为参数需要一个消息,返回值也需要一个消息,可以继续看上面wsdl的文档,messageloginloginResponse两个,一个是用来传递参数,一个是用来传递返回值。到此时,我们就把把消息和元素对应起来了。

    3.portType:定义好消息后,要在服务器端指明哪个接口对它进行操作,也就是指明接口名称,并且要指明接口中有哪些方法,大家可观察上面的wsdl文档,operation就是绑定该接口有哪些方法(login),input表示方法参数,output表示返回值。

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

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

    消息传递

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

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

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


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


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

    下篇开始讲SOAP

  • 相关阅读:
    Oracle 11g 在本机上安装PLSQL DEveloper
    Oracle 11g 启动与关闭服务的脚本
    Oracle 11g 安装过程图解
    linux下vi命令大全
    accuracy、precision、recall、true positives, true negatives, false positives 和 false negatives
    // 40、用1、2、2、3、4、5这六个数字,写一个main函数,打印出所有不同的排列, // 如:512234、412345等,要求:"4"不能在第三位,"3"与"5"不能相连.
    阿里巴巴第二道(研发类) 笔试题1,原题大致描述有一大批数据,百万级别的。数据项内容是:用户ID、科
    621. Task Scheduler
    625. Minimum Factorization
    623. Add One Row to Tree
  • 原文地址:https://www.cnblogs.com/james1207/p/3295321.html
Copyright © 2020-2023  润新知