使用WSDL部署WebService.docx
- 文档编号:27886372
- 上传时间:2023-07-06
- 格式:DOCX
- 页数:25
- 大小:67.96KB
使用WSDL部署WebService.docx
《使用WSDL部署WebService.docx》由会员分享,可在线阅读,更多相关《使用WSDL部署WebService.docx(25页珍藏版)》请在冰豆网上搜索。
使用WSDL部署WebService
简单对象访问协议(SOAP)提供对远程对象的访问。
这些对象有的是简单的JavaBeans组件或者是企业JavaBeans组件和COM/COM+对象等。
这些对象驻留在不同企业内部并且可能存在于因特网的任何位置。
因此,SOAP通过因特网进行通信,它是一种在不同企业间交换信息的机制。
在本文中,Bial会详细的讨论SOAP通信,对象是怎样用SOAP发布其功能的,怎样调用SOAP对象,怎样在有SOAP意识的应用程序间交换信息。
他还会展示第1部分中提到的WSDL应用程序的SOAP服务部署,以及远程服务器对它的调用。
SOAP和WSDL
我在本系列文章的第1部分介绍了WSDL。
WSDL描述了Web服务的接口。
Web服务所有者将用SOAP来实现他们的接口。
因此,WSDL服务实际上作为SOAP服务一样存在。
一旦Web服务用户拥有WSDL文件,他或者她就知晓接口的细节。
他或者她就会用SOAP来与Web服务通信。
可以把Web服务考虑为对象,可以通过WSDL接口公开并且使用SOAP通过因特网远程访问。
既然服务是对象,那么肯定有每种服务的相关属性和每种服务调用的行为。
SOAP消息是XML文档,可通过HTTP工作。
为什么用SOAP?
B2B(Business-to-business)和A2A(application-to-application)需求表明企业之间为交换信息而相互通信。
这种概念被用在B2B、工作流和跨企业集成中。
例如,设想一条垂直供应链,在链上一家企业为了满足它的客户需求而需要调用其提供者的服务。
而一些提供者需要沿供应链进一步下行来调用其它企业的服务。
很明显,在此应用程序中互操作性是最为重要的。
任何单个企业只能实现SOAP通信通道的一端。
另一端将是因特网上任何地方的实体。
在最近几年里,企业之间的集成和互操作性已经成为软件工程师和企业的一个挑战性任务。
平台相关性也成为取得集成和互操作性的一个大问题。
SOAP依然是在企业间取得集成和互操作性最简单的机制。
SOAP体系结构
有了对SOAP和它的用途的基本理解,我现在就展开对其体系结构的讨论以了解一些深层知识。
请参阅图1,在此图里面您可以识别典型SOAP通信体系结构中的一些组件:
SOAP客户机
SOAP服务器
实际服务
图1.一个典型SOAP通信体系结构的组件
让我解释上面所提到的每个实体的体系结构角色。
下面的讨论参照图1。
SOAP客户机
SOAP客户机是一台有SOAP机制的机器,它可以产生SOAP请求并通过HTTP发送到服务器。
一条SOAP请求是一种类型的SOAP消息,通常只有两种类型的SOAP消息:
一条SOAP请求就是一台SOAP客户机发送给SOAP服务器的内容,一条SOAP响应就是SOAP服务器对SOAP客户机响应的内容。
清单1是典型的SOAP请求,请参阅清单2来回顾SOAP响应。
清单1:
一条简单的SOAP请求
Envelope xmlns: SOAP-ENV="http: //schemas.xmlsoap.org/soap/envelope/"> Body> getListOfModelsxmlns: m="urireference"> getListOfModels> Body>
Envelope>
SOAP服务器
SOAP服务器也是一台有SOAP机制的机器,能够接收来自SOAP客户机的请求,并对之作出适当的响应。
这些编过码的响应会返回发出请求的SOAP客户机。
在SOAP服务器内部有三个实体:
服务管理器
被部署服务的列表
XML转换程序
服务管理器负责根据请求管理服务。
请参阅清单1的服务请求,在这里元素 getListOfModelsxmlns: m="urn: MobilePhoneservice">包含了服务的名称。 服务管理器会读取SOAP客户机想调用的SOAP服务的名称并检查所需的服务实际上是否驻留于这台SOAP服务器上。 此后,它会查询被部署服务的列表(SOAP服务器所托管的所有服务的列表)。 若存在,服务管理器将把SOAP请求传送给XML转换程序。 XML转换程序就负责将SOAP请求的XML结构转换成程序员用来实现实际服务的编程语言(例如,Java编程语言)的结构。 还要负责将来自实际服务的响应转换回SOAP响应的XML结构。 请参阅清单2获得SOAP响应的说明。 清单2: 一条简单的SOAP响应 Envelope xmlns: SOAP-ENV="http: //schemas.xmlsoap.org/soap/envelope/"> Body> getListOfModelsResponsexmlns: m="urn: MobilePhoneservice"> getPriceResponse> Body> Envelope> 实际服务 图1中标有actualservice的框就是实际服务驻留的位置。 服务实现可以是: 例如,COM组件或JavaBeans组件的形式。 XML转换程序负责将XML结构转换成合适的方法调用。 当XML转换程序调用了实际服务实现的某个方法时,这个方法就会完成它的工作并且将结果信息返回XML转换程序。 请看一看图1中连接XMLtranslator和actualservice的箭头。 箭头的两端同在一个企业内,这意味着同一个组织控制着通信两端的接口。 与穿过企业边界的在SOAP客户机和SOAP服务器之间的箭头相比,这正是SOAP的目的所在。 SOAP请求响应机制 当SOAP客户机向SOAP服务器发送SOAP消息时,用HTTP协议传输。 这就叫做SOAP与HTTP绑定。 当SOAP服务器收到消息时,将消息交给服务管理器。 服务管理器检查被部署服务的列表,查找在SOAP消息中所需的服务。 若没有查找到所请求的服务,它将请求失败返回给SOAP客户机。 但是若此项服务可以提供,控制权由服务管理器转移给XML转换程序(转换程序完成合适语言的转换并访问实际服务实现)。 服务实现会处理请求并将结果返回给XML转换程序。 XML转换程序将结果转换成SOAP客户机能够理解的SOAP响应(XML文档)。 然后又一次用HTTP绑定来传输SOAP响应。 现在让我们看一下SOAP与HTTP的绑定细节。 SOAP与HTTP绑定 当您将SOAP和HTTP绑定在一起或在HTTP上操作SOAP时,您实际上将HTTP报头加到了SOAP请求和响应上了。 清单1是典型SOAP请求的结构,而清单3、4、5和6都是完整的HTTP请求,用来演示如何将HTTP报头添加到清单1上。 相似地,清单7是一条完整的HTTP响应,针对于来自清单2的SOAP响应。 无论您何时在HTTP上使用SOAP,Content-Type字段必须是text/xml。 现在您可以察看清单3到清单7的详情。 使用HTTP的SOAP请求 您可以将SOAP和HTTP的POST请求方法连用。 为了发送一条SOAPHTTP请求,您需要在HTTP中提供一个 SOAPAction 报头字段。 SOAPAction指定了SOAP请求的目的。 服务器(例如过滤HTTP中SOAP请求消息的防火墙)可以用字段SOAPAction的值来做决定。 HTTP客户机在发送一条SOAPHTTP请求时必须用此报头字段。 SOAPAction可以有如下几种值: SOAPAction: "URI-Reference" SOAPAction: "filename" SOAPAction: "" SOAPAction: 清单3: 演示SOAPAction报头字段中的URI引用 POST/VendorsHTTP/1.1 Host: Content-Type: "text/xml";Charset="utf-8" Content-Length: nnnn SOAPACtion: " xmlversion="1.0"? > Envelopexmlns: SOAP-ENV="http: //schemas.xmlsoap.org/soap/envelope/" > Body> getListOfModelsxmlns: m="urn: MobilePhoneservice"> getListOfModels> Body> Envelope> 清单3在SOAPAction中包括如下URI引用: 这个SOAPAction展示了两部分内容。 第一部分是一个特别SOAP部署的地址: 第二部分是一个片段标识符,它给出了我们感兴趣的方法的名字(#getListOfModels)。 清单4: 演示SOAPAction报头字段中的一个文件名 POST/VendorsHTTP/1.1 Host: Content-Type: "text/xml";Charset="utf-8" Content-Length: nnnn SOAPAction: "MobilePhoneservice#getListOfModels" xmlversion="1.0"? > Envelopexmlns: SOAP-ENV="http: //schemas.xmlsoap.org/soap/envelope/" > Body> getListOfModelsxmlns: m="urn: MobilePhoneservice"> getListOfModels> Body> Envelope> 清单4在SOAPAction中包含一个文件名(MobilePhoneservice#getListOfModels)。 MobilePhoneservice文件必须出现在主机URI(URI是在HTTP报头中host字段()和文件夹名(/Vendors)的结合。 清单5: 演示SOAPAction报头中的空字符串 POST/VendorsHTTP/1.1 Host: Content-Type: "text/xml";Charset="utf-8" Content-Length: nnnn SOAPAction: "" xmlversion="1.0"? > Envelopexmlns: SOAP-ENV="http: //schemas.xmlsoap.org/soap/envelope/" > Body> : getListOfModelsxmlns: m="urn: MobilePhoneservice"> getListOfModels> Body> Envelope> 清单5在SOAPAction中包含一个空字符串("")。 空字符串值表明SOAP的目的和HostURI( 清单6: 演示无值SOAPAction报头 POST/VendorsHTTP/1.1 Host: Content-Type: "text/xml";Charset="utf-8" Content-Length: nnnn SOAPAction: xmlversion="1.0"? > Envelopexmlns: SOAP-ENV="http: //schemas.xmlsoap.org/soap/envelope/" > Body> getListOfModelsxmlns: m="urn: MobilePhoneservice"> getListOfModels> Body> Envelope> 清单6没有包含SOAPAction值。 这表明没有关于消息目的的信息。 用HTTP的SOAP响应 响应将可能是两种类型的SOAP响应中的一种: 一个成功的SOAP操作产生SOAP结果 一个不成功的SOAP操作产生一条SOAP错误消息 清单7: 一条带有HTTP报头的成功SOAP响应 HTTP/1.1Content-Type: "text/xml";Charset="utf-8" Content-Length: nnnn Envelopexmlns: SOAP-ENV="http: //schemas.xmlsoap.org/soap/envelope/"> Body> getListOfModelsResponsexmlns: m="URI-Reference"> getListOfModels> Body> 清单7是第一种情况,在此可以从SOAP服务器取得有意义的结果。 清单8是一条典型的SOAP错误消息。 SOAPHTTP响应遵循HTTP中通信状态信息的HTTP状态码的语义。 若在处理一条请求时发生一个SOAP错误,SOAPHTTP服务器必须发出一条HTTP500"InternalServerError"响应,同时在响应中包括一条带有SOAP出错元素的SOAP消息。 清单8: 一条带有HTTP报头的典型SOAP错误消息 HTTP/1.1500InternalServerError Content-Type: "text/xml";Charset="utf-8" Content-Length: nnnn Envelopexmlns: SOAP-ENV="http: //schemas.xmlsoap.org/soap/envelope/"> Body> : Fault> Fault> Body> Envelope> 使用电子邮件的SOAP HTTP不是唯一绑定SOAP消息的解决方案。 若HTTP不合适,您可以用诸如SMTP的其它机制来用于SOAP绑定。 将SOAP和SMTP绑定,您可以建立一条单向传输路由。 两条单向消息可以用来建立请求/响应通信。 用SMTP来发送一条SOAP消息,您需要遵从以下步骤: 使用MIME-Version报头字段 MIME-Version用一个版本号来区别不同的MIME版本。 它应用邮件处理代理(例如一个POP服务器)来区别旧版本和新版本所生成的邮件消息。 请参阅清单9,它使用了一个MIME-Version报头字段。 清单9: 一个使用电子邮件的SOAP示例 TO: From: Reply-To: Date: SAT,2Feb200216: 00: 00 Message-Id: <4FAB345C8D93E93B7A6E9@> MIME-Version: 1.0 Content-Type: text/xml;charset=utf-8 Content-Transfer-Encoding: QUOTED-PRINTABLE xmlversion="1.0"encoding="UTF-8"? > Envelopexmlns: SOAP-ENV="http: //schemas.xmlsoap.org/soap/envelope/"> Body> echoStringxmlns: prnt="http: //"> echoString> Body> Envelope> 使用Content-Type报头字段: Content-Type用来标识消息主体中的数据类型。 对于SOAP消息Content-Type应该有一个值“text/xml”。 请参阅清单9,它使用了Content-Type。 使用Content-Transfer-Encoding字段: Content-Transfer-Encoding用来指定传输编码的类型,也就是您所要传输的数据是字符格式还是二进制格式。 清单9使用Quoted-Printable编码,这种编码符合依照ASCII字符集的可打印字符。 这种对数据的编码方式使邮件传输代理不可能修改结果八位元。 请参阅清单9,它使用了Content-Transfer-Encoding。 SOAP模式与实现 SOAP消息 一条SOAP消息只是一个XML文档,由一个强制性的SOAPEnvelope组成,SOAPEnvelope有一个可选的SOAPHeader和一个必须有的SOAPBody。 SOAP模式的元素: Envelope Header Body Fault Envelope: Envelope是表示一条SOAP消息的顶层元素。 为了发送一条SOAP消息,必须包括此元素。 Envelope使用必要的SOAP名称空间标识符(http: //schemas.xmlsoap.org/soap/envelope/)。 若Envelope包含了错误的名称空间,会产生一个关于Envelope名称空间版本的错误。 清单10是一个空Envelope。 称其为“空Envelope”是为了强调在通过“投递”发出它之前,它最终应该包含一封“信”(也许是商业信)。 SOAP模式中的“信”就是指“SOAPBody”,HTTPPOST(在HTTP与SOAP的绑定一部分讨论过)就是传输机制。 清单10: 一个空SOAPEnvelope Envelopexmlns: SOAP-ENV="http: //schemas.xmlsoap.org/soap/envelope/"> Envelope> Header: SOAPHeader是可选的。 您可以直接将SOAPBody放到SOAPEnvelope中并完全忽略报头。 报头提供了一个扩展SOAP消息功能的机制。 例如,认证就是由SOAPHeader条目所提供的一种典型扩展。 在此情况下,将有一个认证框架,它会使用SOAP作为更低级别的传输。 请参阅清单11来查看在SOAP中的报头实现。 清单11: 在一个SOAPEnvelope中的报头实现 Envelopexmlns: SOAP-ENV="http: //schemas.xmlsoap.org/soap/envelope/"> : Header> Orderxmlns: m="someURI"SOAP-ENV: mustUnderstand="1"> Order> Header> Envelope> Body: Body元素包含您实际要发送的消息。 它是一个强制性的元素且其子元素通常属于一个用户定义的名称空间。 清单12展示了一条引用一个用户定义的名称空间“u”的SOAP消息。 Body元素是必要信息的容器。 这个元素必须在SOAP消息中出现并且必须是SOAPEnvelope元素的一个直接子元素。 它也必须直接跟在SOAPHeader元素的后面。 若没有Header元素,那么它应直接跟在Envelope元素的后面。 主体可以包含子元素并且子元素可能是受限于名称空间的。 清单12: SOAPEnvelope内有Header,还有Body Envelopexmlns: SOAP-ENV="http: //schemas.xmlsoap.org/soap/envelope/"> Header> Orderxmlns: m="someURI"SOAP-ENV: mustUnderstand="1"> Order> Header> Body> GetPricexmlns: u="someURI">
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 使用 WSDL 部署 WebService