今天我把SOAP相关技术看了下,有点想法.... --- 鸡蛋(100分)

  • 主题发起人 主题发起人 吴剑明
  • 开始时间 开始时间

吴剑明

Unregistered / Unconfirmed
GUEST, unregistred user!
在IBM的站点上看的. 感觉SOAP其实就是某种格式的XML文档.就象SOCKET一样,当符合了某种
格式后,就成了HTTP,FTP等等协议了.不知道理解的对不对?
其实在公司经常使用XML做为传送数据的包格式,对DOM 的API倒很熟了,个人觉得似乎学SOAP
好象意义不象广告里的那么大. 就象学习SOCKET,对SOCKET熟了,再看其他的什么HTTP,FTP都
觉得容易了.不知道这种想法对不对? 请大家批评一下.免得EGG错过了学习的机会哦.谢谢. ^_^
 
您有点悟到了, 到这里讨论吧.
http://www.delphibbs.com/delphibbs/dispq.asp?lid=595773
http://www.delphibbs.com/delphibbs/dispq.asp?lid=600130
 
IBM是中文的吧
看看这里 资源大汇啊
http://www.xmethods.com/
 
下面就是这一个跨越多个Service的调用的SOAP消息示例:
POST /AccountAuthen
tication HTTP/1.1
Host: port.CA.com.cn
Content-Type: text/xml;
charset="utf-8"
Content-Length: nnnn
SOAPAction: "Some-URI"
<SOAP-ENV:Envelope
xmlns:SOAP-ENV=”http://schemas.xmlsoap.org/soap/envelope/”
SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<SOAP-ENV:Header>
<uniB2B:RequestAuthen
tication xmlns:uniB2B=”Some-URI”>
<AccountName>DealEasy</AccountName>
<AccountPassword>12345</AccountPassword>
</uniB2B:RequestAuthen
tication>
<uniB2B:RequestProductInfo xmlns:uniB2B=”Some-URI”
targetEMarketplace=”http://service.eMarketplace.com.cn/ProductQuote”>
<ProductID>Jaguar_X_Type</ProductID >
<FinalUsage function="RequestPurchaseOrder" />
</uniB2B:RequestProductInfo>
</SOAP-ENV:Header>
<SOAP-ENV:Body>
<uniB2B:RequestPurchaseOrder xmlns:uniB2B ="Some-URI">
<ProductID>Jaguar_X_Type</ProductID >
</uniB2B:RequestPurchaseOrder >
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
我们来看看这个SOAP到底有一些什么内容。
开头部分:
POST /AccountAuthen
tication HTTP/1.1
Host: port.CA.com.cn
Content-Type: text/xml;
charset="utf-8"
Content-Length: nnnn
SOAPAction: "Some-URI"
是基本的HTTP发送协议,其实这不是必须的,只是当你选用HTTP作为你的SOAP载体时才需要的。这里我们跳过不说,
如果想知道具体的HTTP协议内容,可以参考相关资料。
接下来一大块就是我们所关心的SOAP消息内容了。我们看到,这个消息是由<SOAP-ENV:Envelope .......> 和
</SOAP-ENV:Envelope> 两个标志符括起来的。其中:
xmlns:SOAP-ENV=”http://schemas.xmlsoap.org/soap/envelope/”
SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
这里指定了两个命名空间。所有的SOAP消息都是使用XML格式来编码的。SOAP应用程序在生成由SOAP定义的所有
元素和属性的时候,应该包含恰当的SOAP的命名空间。SOAP应用程序必须能处理其收到的消息中的SOAP命名空
间。它必须丢弃那些包含不正确命名空间的消息,并且可以处理那些不包含SOAP命名空间的SOAP消息,就好象
他们包含了正确的命名空间一样。关于什么叫做命名空间以及相关的Schema、XML语法,可以查看XML相关资料。
接下来我们看到两部分:Header和Body。一个SOAP必须包含Body,而Header是可选的。Body是最终接收者所想
要得到消息部分。而Header是用于“附加”处理的消息部分。在本例里,最终接收者想知道ProductID的资料,而
想知道这些资料,则必须经过:Authen
tication服务的AccountName和AccountPassword,也就是:
<uniB2B:RequestAuthen
tication xmlns:uniB2B=”Some-URI”>
<AccountName>DealEasy</AccountName>
<AccountPassword>12345</AccountPassword>
</uniB2B:RequestAuthen
tication>
这一部分。然后再经过ProductInfo服务,获得ProductID和FinalUsage相关资料。也就是:
<uniB2B:RequestProductInfo xmlns:uniB2B=”Some-URI”
targetEMarketplace=”http://service.eMarketplace.com.cn/ProductQuote”>
<ProductID>Jaguar_X_Type</ProductID >
<FinalUsage function="RequestPurchaseOrder" />
</uniB2B:RequestProductInfo>
这一部分。这样,一个SOAP消息在到达最终目的地时,会先经过两个不同的服务,取得相关的信息资料后,在
到达最后目的地。这就是最后部分Body的内容了:
<SOAP-ENV:Body>
<uniB2B:RequestPurchaseOrder xmlns:uniB2B ="Some-URI">
<ProductID>Jaguar_X_Type</ProductID >
</uniB2B:RequestPurchaseOrder >
</SOAP-ENV:Body>
注意到uniB2B这个东西了吗?这个标志没有特殊的意义,在XML里,元素标志是由人任意定制的,事实上,完全可以
把uniB2B这个标志换成我们喜欢的东西如:mydog 等等。
到此,我们对一个SOAP消息有了个感性地认识,总结一下:
1 一个SOAP消息由下面成员组成:
* Envelope --- 用来表示该消息的XML元素
* Header --- 用来处理为消息增加附加特定内容的部分
* Body --- 用来交给最终用户处理的部分
2 是否必须出现:
* Envelope --- 是,可以有下级元素,需要命名空间修饰
* Header --- 否,可以有下级元素
* Body --- 是,可以有下级元素
3 SOAP可以使用各种现成协议作为载体,象本例使用了HTTP协议作为载体。而程序员完全可以通过SOCKET,自己
定义一套发送、接收SOAP的处理机制。
因此,我们完全可以认为,SOAP就是一套定义了特定格式的XML数据。就象SOCKET一样,当一个SOCKET有了某种
特定的格式之后,也就成为了某种协议,如HTTP、FTP等等。但是SOAP又有些不同,因为SOAP是基于XML的,因此在
定义时,又会有很大的灵活性,这也要求定义SOAP具体格式时,收发双方要有一个互通的定义。例如上面说的
uniB2B,如果事先不定义好有这个标识符,可能对方就难以解析这个SOAP消息。
以下是回应SOAP消息的答复:
HTTP/1.1 200 OK
Content-Type: text/xml;
charset="utf-8"
Content-Length: nnnn
<SOAP-ENV:Envelope
xmlns:SOAP-ENV=”http://schemas.xmlsoap.org/soap/envelope/”
SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<SOAP-ENV:Body>
<uniB2B:ResponsePurchaseOrder xmlns:uniB2B ="Some-URI">
<OrderID>AJR786503</OrderID>
<Authen
ticatedID>76E4#12A@-98JA#V5GQ</Authen
ticatedID>
<ProductID>Jaguar_X_Type</ProductID >
<ProductPrice>243900.00</ProductPrice>
<ProductNumber>1</ProductNumber>
<IssueDate>2001-4-1</IssueDate>
</uniB2B:ResponsePurchaseOrder >
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>

在DELPHI6推出后,很多朋友纷纷都开始学用DELPHI的各种控件来学习SOAP。其实个人认为还是应该先了解一下
SOAP的协议比较好。否则,很可能成为一个能“写”SOAP程序的,却不知道SOAP协议是什么的人。这种例子已经
很多了,在RAD发达的今天,很多人顺手拿个HTTP的控件就开始写HTTP程序了,但却压根不知道HTTP协议是啥样子
的。

试试看,不依靠DELPHI6的那组控件,我们要写个SOAP的程序,该怎么下手。以下是我的一点体会:
SOAP就是一个传送数据的协议,所以可以与各种应用无关。SOAP并非就一定要用在WEBSERVICE上面,也并非
就必须用HTTP协议来传送。而不管用什么协议接收到SOAP消息后,都可以使用DOM的API进行XML数据解析。我们
再回过头来看看刚才的例子,假设这样一个场景: 有4台机器,一个客户端,3台服务器。互相之间使用SOCKET
作为通信手段:

客户机 -----------> 权限验证服务器 ------> 产品信息服务器 -------> 数据处理服务器

客户端仍然是发送刚才那个SOAP消息,权限验证服务器接到消息后,查看:
<uniB2B:RequestAuthen
tication xmlns:uniB2B=”Some-URI”>
<AccountName>DealEasy</AccountName>
<AccountPassword>12345</AccountPassword>
</uniB2B:RequestAuthen
tication>
然后调用DOM的API,指向<AccountName>和<AccountPassword>节点,分别获得相关数据。通过验证后,把消息
再转发给产品信息服务器。产品信息服务器收到消息后,再查看:
<uniB2B:RequestProductInfo xmlns:uniB2B=”Some-URI”
targetEMarketplace=”http://service.eMarketplace.com.cn/ProductQuote”>
<ProductID>Jaguar_X_Type</ProductID >
<FinalUsage function="RequestPurchaseOrder" />
</uniB2B:RequestProductInfo>
再调用DOM,获得<ProductID>和<FinalUsage ...>的信息,再次转发给数据处理服务器。数据处理服务器读取
Body部分,将<ProductID>信息读取,进行运算,得到结果,然后把SOCKET发回给客户机。客户机根据DOM,把
相关的各部分:<OrderID>、<Authen
ticatedID>、<ProductID>、<ProductPrice>等读取出来,然后显示给客户。
好了,一次简单的SOAP之旅就完成了。:)
当然,在实际运用中,可能会碰到复杂得多的情况。可是不管怎么样,知道基本的原理,也就有了破解困难的
最终钥匙。所以:
SOAP is so easy! ^_^

 
Yes,这就是编程的真谛--------上帝说
 
为什么没什么人有响应呢. ^_^
 
老吴啊,看来我落后了啊,以后要常向你讨教,
你头次那个interbase怎么搞的啊?
 
如果只是一个协议的话,www.ibm.com/cn上面有很多相关的文章可以看
不过我觉得现在类是xml的东西不少,大家还是有必要先对xml研究一下。
 
一个标准的协议而已,不过有微软的强烈支持,值得采用
 
小猪猪:
后来没用啦,改用HASHTABLE来做了. :(
 
你的老板没有把你的脖子拧下来?
 
吳兄解釋清晰,看來對SOAP有一定了解.你的論點非常贊同.
例如,不用toolkit而是從底層來了解SOAP.
敝人因為不想被MS綁著,自己用VC寫一個小Httpclient端程式.
並寫了個小XMLparser,再使用multithread來過場,完成了一隻soap
的程式.(寫分散式程式,不會multithread,實在無法上場)
不一定要做到這麼底層,但至少可以用一些元件如MSXML來實作.
我以為這樣會比較了解XML,HTTP..
至於SOAP在目前這階段能幫我們做什麼,實在也沒有像相關大廠
或媒體炒的那麼嚇人,好像不懂就跟不上時代.這聲勢終將下去.
到那時,大家也比較能持平來看這技術.
有人說SOAP終將代替DCOM,CORBA,....這你相信嗎?
先說個例子.假設有一架構需要log event到database,你希望寫個
event service來讓VC,Delphi,java呼叫把log存到database.
你想用什麼技術來implement?
非常可能是用CORBA.你也可能用SOAP
如果用SOAP,你遇到的問題如下.
HTTP 是request response的機制,必須考慮connection的建立,
component loading的時間,連接database的時間,每一個request都這樣搞一次?
使用CORBA可以一直的保持connection.這種地方SOAP實在沒的比.
再者,http的穩定度一直令人懷疑.loading一大起來,message lost的問題,肯定
突顯出來.
在我看來,SOAP的利基就在各系統間的偶而整合,也就是loading不太大的系統間
整合.如CORBA跟COM跟JAVA這三個島間的整合,跟Web 上的一些花俏又實用的應用
如用手機查今天各台電視在這時段內有何好看的電視影集或電影,影評如何等.
大應用實在不多.如果真那麼好,那IBM(MQ),TIBCO(RV),IONA(Orbix),MS(MSMQ)
都可以去死了.
沒有reference side讓顧客有信心,顧客豈會跟著你下賭注.
SOAP會被整合進各大廠的product line,那也只是眾多接口之一,可以更增加他們的
value,因為他們已有名聲.至於我們,創新的應用才是我們該考慮的.



 
bananafish,: SOAP并不是只能使用Http channle呀!!!!可以用TCP的
 
bananafish:
WEB 服务要讲究个"无状态对象"呀.否则,都使用保持连接的话,怎么能应付WEB上成千上万的
用户呢?再说现在的POOLING已经做的不错了,连接起来很快的.
 
发了封信到你的foxnt21cn@21cn.com <foxnt21cn@21cn.com,
大哥,快去看看。
 
我在IBM的站点上没有找XML的资料啊,在什么地方?
 
左轻侯:
在YAHOO里用SOAP查就是了。:)
去左兄站点逛逛去。^_^
 
后退
顶部