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