使用WSDL发布WebService第二部分简单对象访问协议学习SOAP语法和使用SOAP发布WSDL.docx

上传人:b****8 文档编号:9040180 上传时间:2023-02-02 格式:DOCX 页数:26 大小:25.33KB
下载 相关 举报
使用WSDL发布WebService第二部分简单对象访问协议学习SOAP语法和使用SOAP发布WSDL.docx_第1页
第1页 / 共26页
使用WSDL发布WebService第二部分简单对象访问协议学习SOAP语法和使用SOAP发布WSDL.docx_第2页
第2页 / 共26页
使用WSDL发布WebService第二部分简单对象访问协议学习SOAP语法和使用SOAP发布WSDL.docx_第3页
第3页 / 共26页
使用WSDL发布WebService第二部分简单对象访问协议学习SOAP语法和使用SOAP发布WSDL.docx_第4页
第4页 / 共26页
使用WSDL发布WebService第二部分简单对象访问协议学习SOAP语法和使用SOAP发布WSDL.docx_第5页
第5页 / 共26页
点击查看更多>>
下载资源
资源描述

使用WSDL发布WebService第二部分简单对象访问协议学习SOAP语法和使用SOAP发布WSDL.docx

《使用WSDL发布WebService第二部分简单对象访问协议学习SOAP语法和使用SOAP发布WSDL.docx》由会员分享,可在线阅读,更多相关《使用WSDL发布WebService第二部分简单对象访问协议学习SOAP语法和使用SOAP发布WSDL.docx(26页珍藏版)》请在冰豆网上搜索。

使用WSDL发布WebService第二部分简单对象访问协议学习SOAP语法和使用SOAP发布WSDL.docx

使用WSDL发布WebService第二部分简单对象访问协议学习SOAP语法和使用SOAP发布WSDL

使用WSDL发布WebService(第二部分)简单对象访问协议——学习SOAP语法和使用SOAP发布WSDL

     简单对象访问协议(SOAP)提供了访问远程对象的方法。

这样的对象有JavaBean,EJB组件,COM和COM+对象等等。

这些对象使用不同的公司,可能在互联网上随处可见。

因此SOAP是一种在互联网上交换企业信息的机制。

在本文中,笔者将讨论SOAP通信的细节,对象如何使用SOAP显示其功能,如何调用SOAP对象以及如何在SOAP感知软件中交换信息。

他将演示如何将第一部分中的WSDL程序发布为SOAP服务,及其远程调用。

一.SOAP和WSDL

    我在这个系列的第一部分介绍了WSDL。

WSDL描述WebService的接口。

WebService的拥有者将使用SOAP实现这些的接口。

因此WSDL服务就以SOAP服务的形式存在。

一旦WebService的用户拥有了WSDL文件,他就知道了接口的详细资料,就可以使用SOAP同WebService通信。

    可以将你通过WSDL接口发布的WebService看作对象,它可以通过SOAP从互联网上远程访问。

既然服务都是对象,必然就会有一些属性跟每个服务及其行为相关。

SOAP消息是可能工作在HTTP上的XML文件。

二.使用SOAP的原因

    B2B(business-to-business)和A2A(application-to-application)需要通信的企业双方的指示以交换其信息。

工作流的概念用于B2B,并贯穿于企业集成。

例如,某个企业调用供应商的服务以满足客户的需求,这就形成了一条垂直的供应链。

有的供应商也会拓展供应联调用其他企业的服务。

    显然这类应用软件的交互性极其重要。

任一企业都只是实现SOAP通信的一端,而另一端由互联网上的其他人实现。

    在未来的几年里,企业集成和交互能力将成为软件工程师和企业极具挑战性的任务。

平台依赖性也将是集成和交互能力达成的一大难题。

SOAP是至今为止最简单的实现企业集成和交互能力的机制。

三.SOAP架构

    在初步了解了SOAP及其作用后,下面我将讨论它的架构以了解其内部的情况。

在图Figure1中,你可以看见下面的组件运用于典型的SOAP通信机制中:

1.  SOAPClient

2.  SOAPService

3.  ActualService

 

 

Figure1.ComponentsofatypicalSOAPcommunicationarchitecture

下面讨论上面提及的各个实体在架构中的角色。

SOAPClient

SOAPClient是一个SOAP感知机器,它可以产生SOAP请求并通过HTTP将SOAP请求发送给SOAPServer。

SOAPClient是一种SOAP消息。

一般来说有两种SOAP消息:

SOAPClient发送给SOAPService的SOAP请求消息和SOAPService发送给SOAPClient的SOAP响应消息。

Listing1是一个典型SOAP请求消息,而Listing2则是一个典型SOAP响应消息。

Envelope xmlns:

SOAP-ENV="http:

//schemas.xmlsoap.org/soap/envelope/">

  

Body>

       

getListOfModelsxmlns:

m="urireference">

       

getListOfModels>

   

Body>

Envelope>

SOAPServer

    SOAPServer也是一个SOAP感知机器,它可以接受SOAPClient发来的请求并创建合适的响应。

加密的响应会发给发出请求的SOAPClient。

在SOAPServer内部有三个实体:

1.  Servicemanager

2.  Deployedservicelist

3.  XMLtranslator

Servicemanager管理响应请求的服务。

在Listing1中的SOAP请求中,节点

getListOfModelsxmlns:

m=”urn:

MobilePhoneService”>包含了服务的名称。

Servicemanager会读出ServiceClient向要调用的服务的名称并向包含SOAPService中所有服务列表的Deployedservicelist查询是否有该项服务。

如果有Servicemanager就将SOAP请求发给XMLtranslator。

XMLtranslator将SOAP请求的XML结构转换成程序员用来实现ActualService的程序语言。

XMLtranslator还将ActualService返回的响应转回XML结构的SOAP响应。

Listing2就是一个SOAP响应的例子。

Envelope xmlns:

SOAP-ENV="http:

//schemas.xmlsoap.org/soap/envelope/">

  

Body>

 

getListOfModelsResponsexmlns:

m="urn:

MobilePhoneservice">

   M1

   M2

   M3

 

getListOfModelsResponse>

   

Body>

Envelope>

ActualService

在Figure1中标为ActualService的方框显示了ActualSrrvice的位置。

服务的实现可能是一个COM组件或是一个JavaBean组件。

XMLtranslator会把XML结构转换成合适的方法调用。

当XMLtranslator调用ActualSrrvice的方法时,这些方法会执行其功能并返回结果给XMLtranslator。

Figure1中连接XMLtranslator和ActualService的箭头的两端都在一个企业里,这意味着同一个组织控制着通信两端的接口。

与此相反的是SOAPClient和SOAPService穿越了企业的边界。

这就是SOAP的用途。

SOAP请求响应机制

SOAPClient传输SOAP消息给SOAPService时使用HTTP协议传输。

这称为SOAP绑定HTTP.当SOAPService收到消息时,他将消息传给ServiceManeger.SOAPService检查Deployedservicelist中是否有SOAP消息请求的服务。

如果没有该项服务,他将请求失败的响应发回给SOAPClient。

但如果有该项服务,就由XMLtranslator进行适合的语言转换,访问actualservice的实现。

服务的实现会处理请求并返回结果给XMLtranslator.XMLtranslator再将结果转换为SOAPClient理解的SOAP响应。

同样,HTTP绑定也用在SOAP响应的传输上。

SOAP绑定HTTP

    当你将HTTP同SOAP帮定绑定或是在HTTP上操作SOAP时,你实际上在SOAP请求和响应上添加了HTTP头。

Listing1是典型的SOAP请求,而Listing3,4,5,6演示了在Listing1上添加了HTTP头的SOAP请求。

与此类似的是Listing7演示了在Listing2上添加了HTTP头的SOAP响应。

当你在HTTP上使用SOAP时,Content-Type字段必须为text/html.在Listing7中可以看到Listing3的细节。

一个使用HTTP的SOAP请求

  你可以将SOAP联合在HTTP的请求方法POST上。

要发送一个SOAPHTTP请求,你必须在HTTP头上提供一个SOAPAction字段。

SOAPAction定义了SOAP请求的目的。

服务器(例如过滤HTTP上SOAP请求消息的防火墙)可以使用SOAPAction的值做决定。

HTTP客户端在发出SOAP请求时必须使用HTTP头的这个字段。

SOAPAction可以取的值如下所示:

SOAPAction:

”URI-Reference”

SOAPAction:

”filename”

SOAPAction:

””

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>

图Listing3在SOAPAction中包含了下面的URI引用

这个SOAPAction说明了两件事:

一是SOAP发布的详细地址

 

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>

图Listing4在SOAPAction中包含了一个文件名

(MobilePhoneservice#getListOfModels)。

MobilePhoneservice文件必须放在主机URI下(www.M

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>

图Listing5的SOAPAction中包含了一个控字符串(””)。

空字符串说明SOAP的目标跟主机URI相同(www.M

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>

图Listing6的SOAPAction没有值。

这表明没有消息的目标的信息。

使用HTTP的SOAP响应

SOAP响应有两种类型:

●        成功的SOAP操作产生的SOAP结果。

●        不成功的SOAP操作产生的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">

   m1

   m2

 

getListOfModels>

Body>

图Listing7就是一个从SOAP服务返回的有意义的结果。

图Listing8则是一个典型的SOAP错误消息。

SOAPHTTP响应在HTTP中添加了通信状态信息的HTTP状态码的语义。

当处理请求失败时,SOAPHTTP服务器必须发出一个包含带有SOAP错误元素的SOAP消息的HTTP500内部服务错误的响应。

HTTP/1.1500InternalServerError

Content-Type:

"text/xml";Charset="utf-8"

Content-Length:

nnnn

 

Envelopexmlns:

SOAP-ENV="http:

//schemas.xmlsoap.org/soap/envelope/">

 

Body>

   

Fault>

    Failedtoprocesstherequest

   

Fault>

 

Body>

Envelope>

SOAP和e-mail

HTTP并非是绑定SOAP消息的唯一解决方案。

你可以在HTTP步使用的地方使用其他的机制如SMTP进行SOAP绑定。

绑定SOAP到SMTP,你可以创建一个单向的通道。

两个单向的消息可以建立请求/响应通讯。

为了使用SMTP发送SOAP消息,你必须按照下面的步骤做:

●        使用SMTP头的MIME-Version字段

MIME-Version字段使用版本号区别不同版本的MIME(多用途网际邮件扩充协议).他允许邮件服务代理(如pop 服务)区别新老版本MIME产生的邮件消息。

图Listing9就是用了SMTP头的 MIME-Version字段。

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="">

     PutyourmailMessage

   

echoString>

 

Body>

Envelope>

●        使用SMTP头的Content-Type字段

Content-Type字段用来标明消息体重的数据类型。

”text/xml”就是一个可以去的值。

图Listing9就使用了Content-Type字段。

●        使用SMTP头的Content-Transfer-Encoding字段

Content-Transfer-Encoding字段用来说明传输编码的类型,就是说你想传输什么样的数据,是字符格式还是二进制格式的。

图Listing9使用了QUOTED-PRINTABLE编码就是ASCII字符集中可打印的字符。

它是以邮件传出代理不太可能修改结果字节的方式进行数据编码的

SOAP模式及其撰写

SOAP消息

SOAP消息就是一个XML文档,其中必须有一个包含可选SOAP头和必需的SOAP体的SOAPEnvelope。

SOAP模式的元素:

●        Envelope

●        Header

●        Body

●        Faule

Envelope:

Envelope是SOAP消息的根结点。

该节点在SOAP消息中是必须出现的。

Envelope使用的SOAP名称空间标识:

http:

//schemas.xmlsoap.org/soap/envelope/ 是必需的。

如果Envelope节点包含错误的名称空间就会产生一个Envelope名称空间版本的错误。

Listing10是一个空的Envelope节点。

你称之为空信以强调在”post”之前Envelope节点必须包含一封”信”。

SOAP模式中的信就是一个SOAP体而HTTPPOST则是传输机制。

Listing10

Envelopexmlns:

SOAP-ENV="http:

//schemas.xmlsoap.org/soap/envelope/">

 

Envelope>

Header

SOAP头是可选的。

你可以跳过SOAP头直接在SOAP Envelope中封装一个SOAP体。

SOAP头提供了一个拓展SOAP消息功能的机制。

例如,在SOAP头中添加验证就是一个典型的拓展。

本例中就有一个将在底层传输的验证框架。

Listing11中可以看到SOAP中Header的实现。

Listing11

Envelopexmlns:

SOAP-ENV="http:

//schemas.xmlsoap.org/soap/envelope/">

Header>

 

Orderxmlns:

m="someURI"SOAP-ENV:

mustUnderstand="1">

 

Order>

Header>

Envelope>

Body

Body节点将会包含你想发送的消息。

这是一个必需的节点,而它的字节点通常属于一个用户自定义的名称空间中。

Listing12显示了一个含有用户自定义名称空间“u”的SOAP消息。

Body节点用来包含必需的信息。

Body节点是SOAP消息必需的,而且它必须是SOAPEnvelop节点的直接子节点。

他必须直接跟在SOAPHeader后面。

如果没有Header节点,则直接跟在Envelop节点后面。

Body可以包含字节点,字节点可以有其名称空间。

Envelopexmlns:

SOAP-ENV="http:

//schemas.xmlsoap.org/soap/envelope/">

Header>

 

Orderxmlns:

m="someURI"SOAP-ENV:

mustUnderstand="1">

 

Order>

Header>

Body>

 

GetPricexmlns:

u="someURI">

   m1

 

GetPrice>

Body>

Envelope>

Fault

这个节点指示错误消息。

它必须在Body中出现而最多出现一次。

通常,Fault节点出现在SOAP响应中表明SOAP请求出错了。

Fault的子节点:

●        faultcode(fault标识)

●        faultstring(fault描述)

●        faultactor(引发错误的原因)

●        detail(错误的细节。

通常是相应遇SOAP请求的Body中名称空间的应用程序的错误细节。

Listing13是一个典型的fault消息。

Listing13

Envelopexmlns:

SOAP-ENV="http:

//schemas.xmlsoap.org/soap/envelope/">

Header>

Orderxmlns:

m="someURI"SOAP-ENV:

mustUnderstand="1">

Order>

Header>

Body>

<

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工程科技 > 纺织轻工业

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1