Web服务.

Slides:



Advertisements
Similar presentations
1 Java 语言程序设计 计算机系 鲍金玲. 2 引子 甲骨文 甲骨文是全球最大的信息管理软件及服务供应商,成立于 1977 年,公司总部 设在美国加利福尼亚州的红木城( Redwood Shores ),全球员工达 名, 包括 名开发人员、 7500 多名技术支持人员和.
Advertisements

下一代 Windows 通讯基础 Windows Communication Foundation ( 代码名 “Indigo”) 简介 谢 晓 软件设计工程师 陈耀文 部门经理 Windows 服务器产品部 微软亚洲工程院(上海)
1 网站设计理念 大连理工大学创新实验学院 优秀网站展示 - LAMP 类网站
第三讲 面向对象(上).
6. 6 Overloading methods and constructors 6
第 12 章 SOAP技術.
动态Web开发技术--JSP.
Chapter 5: Service-Oriented Architectures for Distributed Computing 面向服务的分布式体系结构 1.
Java程序设计教程 第一讲 Java概述.
外科护理学 沧州医学高等专科学校.
四資二甲 第三週作業 物件導向程式設計.
通訊科技教育改進計畫 「網路應用與服務組」 行動電子商務課程 XML之簡介.
數位芝麻網路公司( 軟體工程師
Web程序设计 主讲:林福平 太原理工大学 计算机学院 去除PPT模板上的--无忧PPT整理发布的文字
MVC Servlet与MVC设计模式.
全球資訊網(WWW)簡介.
C# 程式設計 第一部分 第1-4章 C# 程式設計 - 南華大學資管系.
Microsoft Application Platform 開發技術導引
Microsoft .NET 第4組 十月15, 2002 B 陳東傑 B 蔣佳勳
國立台灣師範大學 資訊教育系 葉耀明 從SCORM數位學習到ebXML儲存庫 國立台灣師範大學 資訊教育系 葉耀明
Using Web Services for supporting the users of wireless devices T
第5章 异常处理 王德俊 上海交通大学继续教育学院.
XML資料傳輸 黃笠宸 4/3.
数据库操作示例 import java.sql.*; //导入java.sql包 public class JDBCDemo {
专题4:JSP脚本和指令.
例外處理(Exception Handling)
Arena System Technology Architecture 系统技术架构 1、Database V2(Lotus Notes)V3(Oracle8i) 2、Application Server SilverStream2.53 (Java as server side programming.
第 五 讲 Web 服务.
Java基础 JavaSE异常.
以多媒體簡訊服務及智慧型手機建置具物流管理之行動商務系統與 Web Service的應用
C# 的 Web 相關物件之使用 日期 : 2018/11/21.
運籌管理 Chapter 12 資訊科技與運籌管理電子化 祝天雄 博士 99年12月 日.
从制造业的发展看计算机科学与技术的热点问题
高级Web技术 复 习.
软件建模精要 面向对象软件建模技术.
在一定程度上 人类的思维产生于 简单个体之间的相互作用 ——Marvin Minsky.
软件建模训练(6-2) 设计模式 张静 南京理工大学计算机科学与工程学院.
Schema 與DTD的比較 XML Schema 的特性 XML 資料型態 XML Schema 屬性宣告
第5章 方案工程(Solutions Engineering)
Java语言程序设计 第五部分 Java异常处理.
软件服务生态中的非确定性科学问题、互操作性的应用基础问题
授課老師: 林娟娟 教授 報告人 : 黃聖峯 黃崑源
設計網際網路技術為基礎的跨機構資訊交換平台 --以RoHS為例
「寬頻匯流網路管理」教材 模組四: 第一章 網路管理架構
第 13 章 體驗Web Service.
第5章 方案工程(Solutions Engineering)
郑晟 昆明理工大学 云南省计算机技术应用重点实验室
課程名稱:_____________ 指導教授:_____________
XML Web Service 开发 第1章 XML Web Service 第2章 XML Web Service 体系结构
XML基礎課程 5 數位芝麻網路公司 XML講師:蔡斐婷.
大學專題介紹 M-Kaigo老人心靈介護系統
C/C++/Java 哪些值不是头等程序对象
Network Application Programming(3rd Edition)
电子商务 王素凤
第18章 個人入口網站的建立 18-1入口網站的基礎 18-2 建立網站的搜尋引擎 18-3 網頁組件的個人化功能
张孝祥IT课堂 -深入体验Java Web开发内幕
第 15 章 SAX程式設計.
CON223 UDDI:服务的发现和搜索.
一個基於Web Service的 洪氾預警系統
從 ER 到 Logical Schema ──兼談Schema Integration
Java程式初體驗大綱 大綱 在學程式之前及本書常用名詞解釋 Hello Java!程式 在Dos下編譯、執行程式
主编:钟元生 赵圣鲁.
2019/5/3 JAVA Socket(UDP).
Web Service 尹伟铭
IEEM 5352 Enterprise Integration
方法進階及物件導向基礎 Lecturer: 楊昌樺.
第16章 天气预报 --Web Service调用
助教:廖啟盛 JAVA Socket(UDP) 助教:廖啟盛
JAVA 程式設計與資料結構 第三章 物件的設計.
輸出執行結果到螢幕上 如果要將執行結果的文字和數值都「輸出」到電腦螢幕時,程式要怎麼寫? class 類別名稱 {
Presentation transcript:

Web服务

13内容介绍 概念介绍:webservice/soap/wsdl/xml Apache AXIS:实现SOAP的web服务框架 利用axis创建SOAP服务和SOAP客户的方法 SOA

WEB服务 A Service is a piece of software that is not tightly coupled with client applications. Services are dynamically discoverable and composable entities. WEB服务是一种基于XML、SOAP、HTTP、UDDI(Universal Description Discovery and Integration )、WSDL(Web Service Description Language )等一系列标准实现的分布式计算技术。 WEB服务提供了一个松耦合和跨平台的分布式计算环境,它是一个与操作系统无关、程序设计语言无关、机器类型无关、运行环境无关的平台,实现网络上应用的共享,并可用于复杂的系统集成。

WEB服务产生背景(Cont.) 信息化应用需求 跨互联网 松散耦合 协同工作 资源共享 互连 互通 互操作 HTML Any time Any where Any device SOAP/WSDL/UDDI 跨互联网 松散耦合 协同工作 资源共享 Internet

WEB服务的目标 为了让地理上分布在不同区域的计算机和设备一起工作,为用户提供各种各样的服务。 用户可控制要获取信息的内容、时间、方式,不必像目前这样,在无数个信息孤岛中浏览,寻找自己需要的信息。

WEB服务架构 SOA(Service Oriented Architecture)架构 三个参与者:服务提供者、服务请求者、服务中介者 三个基本操作:发布、发现、绑定

XML – 可扩展标记语言 XML:标记内容。标准、通用、可扩展、内容和应用分离、自解释。 XSL:描述XML文档显示格式的语言。 Schema:定义XML文档的结构、内容和语义。 XML技术是最近几年IT产业中最具有变革和创新意义的技术,它使信息第一次有了统一的表达和应用方式。 从技术角度,XML语言只是一种简单的信息描述语言。 从应用角度,XML的价值远不止于此,借助它可准确表示各种类型的数字化信息,阐释信息的内涵和信息之间的关联,从而更好的进行信息共享、定位和查找。

SOAP – 简单对象访问协议 soap以xml形式提供一个简单、轻量的用于在分散或分布环境中交换结构化和类型信息的机制。soap本身并没有定义任何应用程序语义,如编程模型和特定语义的实现。它提供了一个有标准组件的打包模型在模块中编码的机制。 soap消息包括一个必有的soap信封、一个可选的soap头和一个必有的soap体,信封是文档的顶层元素。 SOAP可简单理解为HTTP + XML + RPC:HTTP作为底层通信协议,RPC作为一致性的调用途径、XML作为数据传输的格式。

WSDL – web服务描述语言 将Web服务描述为一组服务访问点,客户端可以通过这些服务访问点对包含面向文档信息或面向过程调用的服务进行访问。 抽象描述访问的操作和访问时使用的请求/响应消息,将其绑定到具体的传输协议和消息格式。 相关的具体部署的服务访问点通过组合就成为抽象的Web服务。 描述服务的主要元素:Types、Message、Operation、Port Type、Binding、Port、Service

UDDI – 统一描述、发现和集成 UDDI 计划最初是由总部在美国加利福尼亚的Ariba 发起的,并在 IBM 和微软公司积极参与下开发的。尝试解决电子商务交易的集成和自动化问题。 UDDI在两个方面提供了其解决方案: 1.它定义了一系列技术规范,使商家可以用来描述自身、他们的产品和服务,以及他们在Web的商业过程。 2.有一个全球企业注册表,能使跨越多个平台上的企业方便地搜索和发现对方。 服务开发者 服务请求者 发现 API WSDL 描述 服务部署 服务提供者 绑定 删除 UDDI 中心 发布API

WEB服务流程图 1. 实现并部署:程序设计语言 服务 服务提供者 2. 服务发布: WSDL+UDDI API 绑 定 服务中介者 注册中心 服务请求者 3. 服务发现: UDDI API+ 参数 4. 请求返回: WSDL

存在的问题 XML:基本文本格式的消息协议,冗长,效率低。 QoS:广域网情况复杂-带宽,可靠性、延迟。 标准:Web服务最底层的UDDI,WSDL,SOAP三大核心标准逐渐成熟,但web服务本身是应用层技术,应用层复杂性是制定标准面临的难题。 安全:消息的机密性和完整性,传输层加密通信、用户认证?需要在方法级别上提供安全性的能力吗? 管理:如何管理高度分布式的系统?集中式还是“外包”?

IT Architecture Overview Portal Service Collaboration Tools B2B Interactions Process Orchestration Business Intelligence Services Applications & Data Service Registry Application functions are built as components (or "services") that are loosely-coupled and well-defined to support interoperability, and to improve flexibility and re-use IBM’s ESB Graphic

SOA 面向服务的软件体系结构的实现 监控 开发 发现 绑定 监控 发现 绑定 发布 发现 开发 绑定 流程开发人员 WSWD 系统管理人员 WSMT 门户 WS Portal 发现 绑定 工作流建模工具 监控 开发 监控 监控管理工具 工作流引擎 WSWF 绑定 发现 服务注册中心 UDDI 发现 发布 Transa ,WSRF Rliable HTTP 1.1 XService XLinker WS 服务提供者 WS XLinker 服务开发者 WSDesigner 服务请求者 WSClient 服务提供者 WS XService 开发 绑定 客户端开发工具 服务开发工具

Web服务协议栈 Transports HTTP, FTP, SMTP,POP3 …

WEB服务架构 SOA(Service Oriented Architecture)架构 三个参与者:服务提供者、服务请求者、服务中介者 三个基本操作:发布、发现、绑定

AXIS平台 AXIS是由Apache实现的一套SOAP服务器,为Web服务应用程序的创建和发布提供了平台。

具体开发流程 创建apache Axis环境,包括下载其web应用 在Tomcat上发布axis的web应用 创建SOAP服务 创建提供SOAP服务的java类 创建SOAP服务的发布描述符文件 管理SOAP服务 发布SOAP服务 删除SOAP服务 创建和运行SOAP客户程序 MVC架构 RMI远程调用(回调)

apache Axis环境 axis-1_2/lib/axis.jar axis-1_2/lib/jaxrpc.jar axis-1_2/lib/saaj.jar axis-1_2/lib/commons-logging.jar axis-1_2/lib/commons-discovery.jar axis-1_2/lib/wsdl4j.jar axis-1_2/ (for the sample code) A JAXP-1.1 compliant XML parser such as Xerces or Crimson. We recommend Xerces, 源代码中有

具体开发流程 创建SOAP服务 创建提供SOAP服务的java类 package mypack; public class HelloService { public String sayHello(String username) { return "Hello:"+username; }

具体开发流程 创建SOAP服务 创建提供SOAP服务的java类 创建SOAP服务的发布描述符文件 Wsdd文件来发布soap服务 <deployment> <service> <parameter name=“” value=“” />

WSDD <deployment xmlns="http://xml.apache.org/axis/wsdd/" xmlns:java="http://xml.apache.org/axis/wsdd/providers/java"> <service name="MyService" provider="java:RPC"> <parameter name="className" value="samples.example3.MyService"/> <parameter name="allowedMethods" value="*"/> </service> </deployment> 非常简单,最外层元素告诉引擎这是一个WSDD部署文件,并且定义了java的名字空间,接下来的service元素定义了我们的服务。一个服务就是一个targeted chain,意味着它将有下面的一个或多个:一个请求流,一个Handler,一个响应流。这里我们的provider是Axis内置的java:RPC ,这说明这是一个Java RPC服务。为了让RPCProvider能够调用正确的方法,我们使用<parameter>标签,一个参数定义服务的类名,另一个参数告诉引擎这个类的任何public方法都可以通过SOAP调用。

更多的部署 现在让我们来了解Axis引擎更强大的特性,假设你想知道你的服务被调用了多少次,我们在sample/log下有一个简单的handler来实现这一点。要使用这个handler类,你需要首先部署它,然后你使用你给他指定的名字来部署服务,下面是一个简单的部署文件:

更多的部署 <deployment xmlns="http://xml.apache.org/axis/wsdd/" xmlns:java="http://xml.apache.org/axis/wsdd/providers/java"> <!-- define the logging handler configuration --> <handler name="track" type="java:samples.example4.LogHandler"> <parameter name="filename" value="MyService.log"/> </handler> <!-- define the service, using the log handler we just defined --> <service name="LogTestService" provider="java:RPC"> <requestFlow> <handler type="track"/> </requestFlow> <parameter name="className" value="samples.example4.Service"/> <parameter name="allowedMethods" value="*"/> </service> </deployment>

更多的部署 第一部分定义了一个称作track的Handler,它是由LogHandler类实现的,我们同时使用了参数指定了写入log的文件。 这样我们就定义了一个web服务,LogTestService,它和我们看到的RPC服务是一样的。不同的地方是在<service>元素内我们包含了<requestFlow>元素——这意味着当你调用这个服务时需要执行一些Handlers。通过引入一个track,我们保证了每次调用服务都会写如日志。

具体开发流程 管理SOAP服务 发布SOAP服务 删除SOAP服务 两种管理工具:1、 基于web的 2、基于命令行的

具体开发流程 创建和运行SOAP客户程序 import org.apache.axis.client.Call; import org.apache.axis.client.Service; import javax.xml.namespace.QName; public class HelloClient { public static void main(String [] args) { try { String username="Guest"; if(args.length!=0) username=args[0]; String endpoint = "http://localhost:8080/axis/services/helloservice"; Service service = new Service(); Call call = (Call) service.createCall(); call.setTargetEndpointAddress( new java.net.URL(endpoint) ); call.setOperationName(new QName("urn:helloservice", "sayHello") ); String ret = (String) call.invoke( new Object[] { username} ); System.out.println(ret); } catch (Exception e) { e.printStackTrace(); } }}

具体开发流程 创建和运行SOAP客户程序 import org.apache.axis.client.Call; import org.apache.axis.client.Service; import javax.xml.namespace.QName; public class HelloClient { public static void main(String [] args) { try { String username="Guest"; if(args.length!=0) username=args[0]; String endpoint = "http://localhost:8080/axis/services/helloservice"; Service service = new Service(); Call call = (Call) service.createCall(); call.setTargetEndpointAddress( new java.net.URL(endpoint) ); call.setOperationName(new QName("urn:helloservice", "sayHello") ); String ret = (String) call.invoke( new Object[] { username} ); System.out.println(ret); } catch (Exception e) { e.printStackTrace(); } }}

请求格式 <?xml version="1.0" encoding="UTF-8"?> <SOAP-ENV:Envelope xmlns:xsd=http://www.w3.org/2001/XMLSchema xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <SOAP-ENV:Body> <ns1:echoString xmlns:ns1="http://soapinterop.org/"> <arg0 xsi:type="xsd:string">Guest</arg0> </ns1:echoString> </SOAP-ENV:Body> </SOAP-ENV:Envelope>

响应格式 <?xml version="1.0" encoding="UTF-8"?> <SOAP-ENV:Envelope xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <SOAP-ENV:Body> <ns1:echoStringResponse xmlns:ns1="http://soapinterop.org/"> <result xsi:type="xsd:string">Hello!Guest</result> </ns1:echoStringResponse> </SOAP-ENV:Body> </SOAP-ENV:Envelope>

wsdl主要内容 WSDL发展历史 WSDL的基本属性 WSDL的定义 WSDL的文档框架 --类型 消息 端口类型 绑定 服务

WSDL发展历史 Web服务描述语言WSDL(Web Services Description Language)是一个建议性标准。用于描述Webb服务的技术调用语法。 1999年HP(惠普)公司是第一个引入Web服务概念,eSpeak实现了“电子服务”平台。 2000年6月Microsoft提出了“Web服务”术语,把Web服务作为.NET计划重要组件。 在Microsoft的SDL(Service Description Language和SCL(SOAP Contract Language)和IBM的NASSL(Network Accessible Service Specification Language)这两项技术的结合,形成了WSDL的基础。SCL采用XML来描述应用程序所交换的消息,NASSL描述服务接口和实现细节。 2000年9月25日IBM、Microsoft和Ariba提出WSDL1.0。2001年3月15日,他们提交的WSDL1.1成为W3C的Note。WSDL1.1规范网址是http://www.w3.org/TR/wsdl。2002年7月9日提出WSDL1.2,2003年11月10日提出WSDL2.0。

WSDL描述web服务的三个基本属性: 服务做些什么? 如何访问服务? 服务位于何处? 服务所提供的操作(方法); 数据格式以及访问服务操作的必要协议; 服务位于何处? 由特定协议决定的网络地址,如URL。

Web服务描述语言(Web Services Description Language WSDL)是Web Services技术重要组成部分。 WSDL描述了分布在Internet环境中服务操作的抽象定义接口和服务的具体实现端口,实现远程计算资源共享。 WSDL通常是协议定义的,协议描述缺乏准确性和严格性,需要一种形式化的表示和描述方法。

面向服务视图 规范描述资源与协议变换 实现自动服务部署和调用 客户端(人) 运行时 操作 客户端(机器) 服务 资源 WSDL2JAVA JAVA2WSDL UDDI 客户端(人) 发现与定位 发布 Content 发现与定位 浏览器AJAX 运行时 操作 客户端(机器) 服务 规范描述资源与协议变换 实现自动服务部署和调用 资源

SOAP RPC SOAP文档内容 <soap:envelope> <soap:body> <myMethod> <x>5</x> </myMethod> </soap:body> </soap:envelope>

服务调用 SOAP消息 SOAP消息 HTTP HTTP WSDL2JAVA XML2JAVA 服务描述CONTEXT Class Operation XML Message XML Message SOAP消息 SOAP消息 前置机 HTTP HTTP

WSDL定义 WSDL是XML描述的网络服务,基于消息机制、包含面向文本或面向过程信息的操作集合。 操作及消息的抽象定义与它们具体的网络实现和数据格式绑定是分离的,这样就可以重用这些抽象定义。 消息是需要交换数据的抽象描述; 端点类型是操作的抽象集合。 针对一个特定端点类型的具体协议和数据格式规范构成一个可重用的绑定。 一个端点定义成网络地址和可重用的绑定的联接,端点的集合定义为服务。

服务接口定义和服务实现定义 服务接口组成了服务描述中的可重用部分, type元素、message和portType。 types元素中描述消息中复杂数据类型的使用。 message元素指定XML 数据类型组成消息的各个部分。message 元素用于定义操作的输入和输出参数。 portType元素中定义了Web服务的操作。操作定义了输入和输出数据流中可以出现的XML消息。

服务实现定义是一个描述给定服务提供者如何实现特定服务接口的WSDL文档。 有binding和services。 服务接口定义和服务实现定义 服务实现定义是一个描述给定服务提供者如何实现特定服务接口的WSDL文档。 有binding和services。 binding 元素描述特定服务接口的协议、数据格式、安全性和其它属性。 service元素。服务元素包含一组port元素。端口将端点与来自服务接口定义的binding 元素关联起来。

WSDL是一种XML应用,它将Web Services描述定义为一组服务访问端点,客户端可以通过这些服务访问端点对包含面向文档信息或面向过程调用的服务进行访问。 在具体使用中,可以使用任意的消息格式和网络协议。 在WSDL规范中,定义了如何使用SOAP消息格式、HTTP GET/POST消息格式以及MIME格式来完成Web Services交互的规范。

WSDL特点 实现 Web 服务体系结构的松散耦合; 无论是请求者还是提供者可以各自独立地使用平台、编程语言或分布式对象模型。

命名空间 wsdl http://schemas.xmlsoap.org/wsdl/ soap http://schemas.xmlsoap.org/wsdl/soap/ http http://schemas.xmlsoap.org/wsdl/http/ mime http://schemas.xmlsoap.org/wsdl/mime/ soapenc http://schemas.xmlsoap.org/soap/encoding/ soapenv http://schemas.xmlsoap.org/soap/envelope/ xsi http://www.w3.org/2000/10/XMLSchema-instance xsd http://www.w3.org/2000/10/XMLSchema

WSDL文档框架 <wsdl:definitions name="nmtoken"? targetNamespace="uri"?> <import namespace="uri" location="uri"/>* <wsdl:types> ? ……</wsdl:types> <wsdl:message name=“nmtoken”>* ……</wsdl:message> <wsdl:portType name="nmtoken">* ……</wsdl:portType> <wsdl:binding name="nmtoken" type="qname">* ……</wsdl:binding> <wsdl:service name="nmtoken">*……</wsdl:service> </wsdl:definitions>

types元素 <wsdl:types> ? <wsdl:documentation .... />? <xsd:schema .... />* <-- extensibility element --> * </wsdl:types>

message元素 <wsdl:message name="nmtoken"> * <wsdl:documentation .... />? <part name="nmtoken" element="qname"? type="qname"?/> * </wsdl:message>

portType元素 <wsdl:portType name="nmtoken">* <wsdl:documentation .... />? <wsdl:operation name="nmtoken">* <wsdl:documentation .... /> ? <wsdl:input name="nmtoken"? message="qname">? </wsdl:input> <wsdl:output name="nmtoken"? message="qname">? </wsdl:output> <wsdl:fault name="nmtoken" message="qname"> * </wsdl:fault> </wsdl:operation> </wsdl:portType>

binding元素 <wsdl:binding name="nmtoken" type="qname">* <wsdl:documentation .... />? <-- extensibility element --> * <wsdl:operation name="nmtoken">* <wsdl:documentation .... /> ? <wsdl:input> ? <-- extensibility element --> </wsdl:input> <wsdl:output> ? </wsdl:output> <wsdl:fault name="nmtoken"> * </wsdl:fault> </wsdl:operation> </wsdl:binding>

service元素 <wsdl:service name="nmtoken"> * <wsdl:documentation .... />? <wsdl:port name="nmtoken" binding="qname">* <wsdl:documentation .... /> ? <-- extensibility element --> </wsdl:port> </wsdl:service>

类型 types元素包含了交换消息的数据类型定义。为了实现最大的互操作性(interoperability)和平台中立性(neutrality),WSDL选用XML Schema DataTypes,简称XSD作为标准类型系统,并将它作为固有类型系统。 <definitions .... > <types> <xsd:schema .... />* </types> </definitions>

类型—XSD编码抽象数据类型建议 使用元素(element)形式,而不使用属性(attribute)形式; 不包括仅在特殊的协议和数据格式中使用的元素或者属性; 数组类型使用Soap:Array 类型,并使用ArrayOfXXX作为数组类型的名; 使用XSD编码表示xsd:anyType。

<types> <schema…> <element name="PO" type="tns:POType"/> <complexType name="POType"> <element name="id" type="string/> <element name="name" type="string"/> <element name="items"> <complexType> <element name="item" type="tns:Item" minOccurs="0“ maxOccurs="unbounded"/> </complexType> </element> <complexType name="Item"> <element name="quantity" type="int"/> <element name="product" type="string"/> <element name="Customer" type="tns:CustomerType"/> <complexType name="CustomerType"> </schema> </types>

消息 消息由若干个逻辑部件(part)构成。每个部件使用一个消息类型属性与某个类型系统的类型相关联。 消息定义与法如下: <definitions .... > <message name="nmtoken"> * <part name="nmtoken" element="qname"? type="qname"?/> * </message> </definitions> 消息(message)name属性指定了消息的名称。 如果消息具有多个逻辑单位,则需要使用多个part元素。

消息示例 <message name="PO"> <part name="po" element="tns:PO"/> <part name="customer" element="tns:Customer"/> </message> <message name="P1"> <part name=“address" type=“XSD:string"/> <message name="P2"> <part name="composite" type="tns:Composite"/>

在WSDL文档中,消息名称定义具有唯一性,即 s=λ(&s,"definition\*") 在WSDL文档中,消息名称定义具有唯一性,即 xλ(&s,"message") (yλ(&s,"message","name",σ(&x,"name"))x=y) 在消息定义中,部件名称定义具有唯一性,即 yλ(&x,"message\part") (zλ(&x,"message\part","name",σ(&y,"name")) y=z)

消息类型属性集合是可扩展的。WSDL定义如下消息类型属性 element:使用QName引用一个XSD元素,即 xλ(&s, "message\part") (σ(&x,"element") !yλ(&s,"types\schema\element") σ(&x,"element")=σ(&y,"name"))) type:使用QName引用个XSD simpleType(简单类型)或XSD complexType (复含类型),即 xλ(&s,"message\part") (σ(&x,"type") σ(&x,"type")XSDtypes) yλ(&s,"types\schema\complexType") (σ(&x,"type")=σ(&y,"name")) yλ(&s,"types\schema\simpleType") (σ(&x,"type")=σ(&y,"name")))

端口类型定义 端口类型是一个由抽象操作和抽象消息构成的有名称的集合。 <wsdl:definitions .... > <wsdl:portType name="nmtoken"> * <wsdl:operation name="nmtoken"> <wsdl:input name="nmtoken"? message="qname"/> <wsdl:output name="nmtoken"? message="qname"/> <wsdl:fault name="nmtoken" message="qname"/>* </wsdl:operation> </wsdl:portType > </wsdl:definitions> 端口类型定义的name属性表示端口类型名称,操作定义的name属性表示操作名称。

s=λ(&s,"definition\*") 端口类型名称具有唯一性,即 xλ(&s,"portType") (yλ(&s,"portType","name",σ(&x,"name")) x=y) 在相同端口类型中,操作名称具有唯一性,即 yλ(&x,"portType\operation") (zλ(&x,"portType\operation","name",σ(&y,"name")) y=z)

在不同的端口类型中,如果操作名称相同,则操作定义相同。 xλ(&s,"portType\operation") (yλ(&s,"portType\operation","name",σ(&x,"name")) x=y) 操作的input、output和fault元素的message属性所指定的消息,在WSDL的message中已定义,即 xλ(&s,"portType\operation\input") yλ(&s,"message")(σ(&x,"message")=σ(&y,"name")) xλ(&s,"portType\ operation\output")  yλ(&s,"message")(σ(&x,"message")=σ(&y,"name")) xλ(&s,"portType\ operation\fault")  yλ(&s,"message")(σ(&x,"message")=σ(&y, "name"))

操作 WSDL支持4种消息交换方式,来访问服务端点。 操作中引用到的消息通过message属性指定。 单向(One-way):服务访问端点接收消息; 请求响应(Request-response):服务访问端点接收请求消息,然后发送响应消息; 要求应答(Solicit-response):服务访问端点发送要求消息,然后接收应答消息; 通知(Notification):服务访问端点发送通知消息。 操作中引用到的消息通过message属性指定。

单向操作 单向操作语法: <wsdl:definitions .... > <wsdl:portType .... > * <wsdl:operation name="nmtoken"> <wsdl:input name="nmtoken"? message="qname"/> </wsdl:operation> </wsdl:portType > </wsdl:definitions> input元素指定用于单向操作的抽象消息格式。

请求响应操作 请求响应操作语法 <wsdl:definitions .... > <wsdl:portType .... > * <wsdl:operation name="nmtoken" parameterOrder="nmtokens"> <wsdl:input name="nmtoken"? message="qname"/> <wsdl:output name="nmtoken"? message="qname"/> <wsdl:fault name="nmtoken" message="qname"/>* </wsdl:operation> </wsdl:portType > </wsdl:definitions>

要求应答操作 要求应答操作语法 <wsdl:definitions .... > <wsdl:portType .... > * <wsdl:operation name="nmtoken" parameterOrder="nmtokens"> <wsdl:output name="nmtoken"? message="qname"/> <wsdl:input name="nmtoken"? message="qname"/> <wsdl:fault name="nmtoken" message="qname"/>* </wsdl:operation> </wsdl:portType > </wsdl:definitions>

通知操作 通知操作语法 <wsdl:definitions .... > <wsdl:portType .... > * <wsdl:operation name="nmtoken"> <wsdl:output name="nmtoken"? message="qname"/> </wsdl:operation> </wsdl:portType > </wsdl:definitions>

操作中的元素名称 如果单向操作和通知操作未指定name属性,则该属性名默认为是操作名。 操作名+“Request”/“Responese”/“Solicit”。 针对于请求应答和要求应答操作可以通过parameterOrder指定一个参数名列表。该属性的值是一个用空格分开的消息构件名序列 。

绑定 绑定语法如下: <wsdl:definitions .... > <wsdl:binding name="nmtoken" type="qname"> * <-- extensibility element (1) --> * <wsdl:operation name="nmtoken"> * <-- extensibility element (2) --> * <wsdl:input name="nmtoken"? > ? <-- extensibility element (3) --> </wsdl:input> <wsdl:output name="nmtoken"? > ? <-- extensibility element (4) --> * </wsdl:output> <wsdl:fault name="nmtoken"> * <-- extensibility element (5) --> * </wsdl:fault> </wsdl:operation> </wsdl:binding> </wsdl:definitions>

服务与访问端点 访问端点(port)通过为绑定指定唯一地址来定义一个访问端点。访问端点语法如下: <wsdl:definitions .... > <wsdl:service .... > * <wsdl:port name="nmtoken" binding="qname">* <-- extensibility element (1) --> </wsdl:port> </wsdl:service> </wsdl:definitions> 在WSDL文档范围内,访问端点的name属性具有唯一性。

服务 服务是访问端点集合,服务语法如下: <wsdl:definitions .... > <wsdl:service name="nmtoken">* <wsdl:port ..../>* </wsdl:service> </wsdl:definitions> 在WSDL文档中,服务的name属性具有唯一性。

服务中的访问端点具有如下的关系: 所有访问端点都不相互通信,即一个服务的访问端点的输出不会是另一个访问端点的输入。 如果一个服务中有多个访问端点属于同一端口类型,但是对应不同的绑定或者地址,则这些访问端点可以相互替换。这使得WSDL文档使用者根据需要选择访问端点。 通过检查访问端点可以确定服务的端口类型。这使得WSDL文档的使用者能够根据它支持的端口类型决定是否与一个特定的服务通讯。

SOAP绑定 <binding…> <soap:binding style="rpc|document" transport="uri"> <operation…> <soap:operation soapAction="uri"? style="rpc|document"?>? <input> <soap:body parts="nmtokens"? use="literal|encoded" encodingStyle="uri-list"? namespace="uri"?> <soap:header element="qname" fault="qname"?>* </input> <output> </output> <fault>* <soap:fault name="nmtoken" use="literal|encoded" </fault> </operation> </binding>

soap:binding元素 SOAP:binding元素表明WSDL文档绑定到SOAP协议格式,该元素在使用SOAP绑定时是必需的。 <definitions .... > <binding .... > <soap:binding transport="uri"? style="rpc|document"?> </binding> </definitions> style属性值是它所包含的操作子元素的style属性的默认值。 transport属性是必需的,它的值表示绑定的传输方式与SOAP的何种传输方式一致。URI值http://schemas.xmlsoap.org/soap/http 表示传输方式和SOAP规范的HTTP绑定相一致。

soap:operation <definitions .... > <binding .... > <soap:operation soapAction="uri"? style="rpc|document"?>? </operation> </binding> </definitions>

soap:body <definitions .... > <binding .... > <operation .... > <input> <soap:body parts="nmtokens"? use="literal|encoded"? encodingStyle="uri-list"? namespace="uri"?> </input> <output> encodingStyle="uri-list"? namespace="uri"?> </output> </operation> </binding> </definitions>

soap:fault <definitions .... > <binding .... > <operation .... > <fault>* <soap:fault name="nmtoken" use="literal|encoded" encodingStyle="uri-list"? namespace="uri"?> </fault> </operation> </binding> </definitions>

soap:header和soap:headerfault <definitions .... > <binding .... > <operation .... > <input> <soap:header message="qname" part="nmtoken" use="literal|encoded" encodingStyle="uri-list"? namespace="uri"?>* <soap:headerfault message="qname" part="nmtoken" use="literal|encoded" encodingStyle="uri-list"? namespace="uri"?/>* <soap:header> </input> <output> </output> </operation> </binding> </definitions>

soap:address <definitions .... > <port .... > <soap:address location="uri"/> </port> </definitions>

portType、binding与port 一个portType可以对应多个bindng 一个binding可以对应多个port portType binding binding binding port port port port

消息传递模式 1.rpc/encoded 2.rpc/literal 3.document/encoded 4.document/literal

服务 public class myServices { public void myMethod (int x){ return }

rpc/encoded样式 WSDL文档内容 <message name="myMethodRequest"> <part name="x" type="xsd:int"/> </message> <message name="empty"/> <portType name="PT"> <operation name="myMethod"> <input message="myMethodRequest"/> <output message="empty"/> </operation> </portType>

rpc/encoded样式 SOAP文档内容 <soap:envelope> <soap:body> <myMethod> <x xsi:type="xsd:int">5</x> </myMethod> </soap:body> </soap:envelope>

2 rpc/literal样式 WSDL文档内容 <message name="myMethodRequest"> <part name="x" type="xsd:int"/> </message> <message name="empty"/> <portType name="PT"> <operation name="myMethod"> <input message="myMethodRequest"/> <output message="empty"/> </operation> </portType>

2 rpc/literal样式 SOAP文档内容 <soap:envelope> <soap:body> <myMethod> <x>5</x> </myMethod> </soap:body> </soap:envelope>

3 document /encoded WSDL文档内容 <types> <schema> <element name="xElement" type="xsd:int"/> </schema> </types> <message name="myMethodRequest"> <part name="x" element="xElement"/> </message> <message name="empty"/> <portType name="PT"> <operation name="myMethod"> <input message="myMethodRequest"/> <output message="empty"/> </operation> </portType>

3 document /encoded SOAP文档内容 <soap:envelope> <soap:body> <xElement xsi:type="xsd:int ">5</xElement> </soap:body> </soap:envelope>

4.document /literal WSDL文档内容 <type> <schema> <element name="xElement" type="xsd:int"/> </schema> </types> <message name="myMethodRequest"> <part name="x" element="xElement"/> </message> <message name="empty"/> <portType name="PT"> <operation name="myMethod"> <input message="myMethodRequest"/> <output message="empty"/> </operation> </portType>

4.document /literal SOAP文档内容 <soap:envelope> <soap:body> <xElement>5</xElement> </soap:body> </soap:envelope>

5 document / literal-wrap <message name="myMethodRequest"> <part name=" parameters" element=" myMethod"/> </message> <message name="empty"/> <portType name="PT"> <operation name="myMethod"> <input message="myMethodRequest"/> <output message="empty"/> </operation> </portType> WSDL文档 <types> <schema> <element name="myMethod"/> <complexType> <sequence> <element name="x" type="xsd:int"/> </sequence> </complexType> </element> </schema> </types>

5 document / literal-wrap SOAP文档 <soap:envelope> <soap:body> <myMethod> <x>5</x> </myMethod> </soap:body> </soap:envelope>

Thank You !