介绍一下SOAP,是什么来的,有什么应用呢?

rt
---------------------------------------------------------------

摘录programfan

如果想了解SOAP到底是什么,就要自己动手建立自己的SOAP标准对象。本文可以帮助你起步。

简介

SOAP - 简单对象处理协议(Simple Object Access Protocol) - 是当前XML开发的热点。它是微软新一代Visual Studio的主要角色,是".NET"策略的基础。如果想用VB 6编制一个有保障的SOAP服务,可以查阅微软的SOAP工具包(VB)。但如果想了解SOAP到底是什么,就要自己动手建立自己的SOAP标准对象。本文可以帮助你起步。
本文中,我们创建一个简单的SOAP服务端和一个客户端。服务端用ASP编写,名为soap.asp。这个文件应存放在个人Web服务器的根目录下,如:\Inetpub\wwwroot。这个服务器将接受和处理客户端提出的SOAP请求。客户端是一个简单的VB可执行文件,由Sub Main()启动。

步骤
众所周知,SOAP是一个“呼叫-响应”机制,按客户/服务方式运行。客户端(应用程序)向服务端(位于互联网上的某个Web服务器)发出函数调用请求并传递参数;服务端则返回响应。呼叫与响应的内容和数据都是按XML文件格式进行传送的。因此,要建立一个简单的SOAP应用系统,就要建立一个客户端和一个服务端,即一个呼叫-响应体系。

下面是一个简单例子:

我们建立一个服务端来计算销售交易的税款。按照传统的VB术语,即建立一个函数,定义如下:

Public Function GetSalesTax(ByVal pSalesTotal As Double) as Double

GetSalesTax = pSalesTotal * 0.04

End Function

一个粗糙的函数,但可作为示例(本例只能用于税率为4%的地方)。

这个函数定义了一个函数名(GetSalesTax),一个参数(pSalesTotal – 销售金额)和一个返回值(函数返回值)。按照面向对象原则,可以认为pSalesTotal是一个"IN"参数,GetSalesTax返回值是一个"OUT"参数。因此我们的SOAP服务端就要侦听客户发出的调用GetSalesTax的请求和传递的"IN"参数(销售金额),然后返回带有"OUT"参数的回应,向客户返回所需税款。

客户端

下面是用VB建立一个呼叫服务的客户端程序:

dblSalesTax = GetSalesTax(100)

得到返回值$4。

如果GetSalesTax函数是一个外部对象,比如在MTS服务器上,就要调用服务器上的DLL模块:

Dim objTax As New CTaxCalc

dblSalesTax = objTax.GetSalesTax(100)

在SOAP系统中,远程调用的方式略有不同,呼叫是通过XML文件传送到服务器的。XML文件里有调用的函数名和相应的参数:

  1<getsalestax>
  2<salestotal>100</salestotal>
  3<getsalestax>   
  4  
  5  
  6  
  7为确保服务器能够识别和解释客户请求,呼叫指令被包装到一个称之为SOAP信封的大文件里。这个信封使用的是SOAP封装标准的通用命名空间:   
  8  
  9<soap:envelope xmlns:soap="urn:schemas-xmlsoap-org:soap.v1">
 10<soap:header></soap:header>
 11<soap:body>
 12<getsalestax>
 13<salestotal>100</salestotal>
 14<getsalestax>
 15</getsalestax></getsalestax></soap:body>
 16</soap:envelope>   
 17  
 18  
 19  
 20最后,加入函数调用的命名空间,起到函数声明的作用:   
 21  
 22<soap:envelope xmlns:soap="urn:schemas-xmlsoap-org:soap.v1">
 23<soap:header></soap:header>
 24<soap:body>
 25<m:getsalestax xmlns:m="urn:myserver/soap:TaxCalc">
 26<salestotal>100</salestotal>
 27</m:getsalestax>
 28</soap:body>
 29</soap:envelope>   
 30  
 31  
 32  
 33现在,已经准备好客户请求文件,可以送往服务端了。发送请求很简单,可以跟浏览器表单一样,用HTTP post方式。浏览器可以向服务端发送复杂的表单,.NET可以向服务器发送VB代码,但我使用XMLHTTP(IE 5以上版本才能用)。   
 34  
 35  
 36  
 37假设strEnvelope含有XML文件格式的请求,发送格式如下:   
 38  
 39Dim objHTTP As New MSXML.XMLHTTPRequest   
 40  
 41Dim strEnvelope As String   
 42  
 43  
 44  
 45'设定发往本地服务器   
 46  
 47objHTTP.open "post", "http://localhost/soap/soap.asp"   
 48  
 49  
 50  
 51'设定标准SOAP/ XML文件头格式   
 52  
 53objHTTP.setRequestHeader "Content-Type", "text/xml"   
 54  
 55  
 56  
 57'设置呼叫函数请求   
 58  
 59objHTTP.setRequestHeader "SOAPMethodName", _   
 60  
 61"urn:myserver/soap:TaxCalc#GetSalesTax"   
 62  
 63  
 64  
 65'呼叫SOAP   
 66  
 67objHTTP.send strEnvelope   
 68  
 69  
 70  
 71'取得返回值   
 72  
 73strReturn = objHTTP.responseBody   
 74  
 75  
 76  
 77至此,客户端完成了向服务端发送请求的过程。现在回到服务端,看看服务端如何侦听客户请求并作出响应。   
 78  
 79  
 80  
 81服务端   
 82  
 83服务端要能够接收客户发出的HTTP请求,在本地服务器(http://localhost/soap.asp)接收到客户请求时作出回应。因此服务端要能够解析客户端发出的XML格式(SOAP封装)的请求,取出调用的函数名和参数。   
 84  
 85  
 86  
 87服务端文件是soap.asp,它接收客户请求的做法是:   
 88  
 89Set objReq = Server.CreateObject("Microsoft.XMLDOM")   
 90  
 91objReq.Load Request   
 92  
 93  
 94  
 95然后用XSL样式从封装的XML文件中取出参数:   
 96  
 97strQuery = "SOAP:Envelope/SOAP:Body/m:GetSalesTax/SalesTotal"   
 98  
 99varSalesTotal = objReq.SelectSingleNode(strQuery).Text   
100  
101  
102  
103根据参数计算税款:   
104  
105varSalesTax = varSalesTotal * 0.04   
106  
107  
108  
109在将结果返回给客户之前,要按SOAP标准做格式化封装。过程与客户端类似,只是把"IN"参数改换为"OUT"参数,并将函数标记名标为回应:   
110  
111<soap:envelope xmlns:soap="urn:schemas-xmlsoap-org:soap.v1">
112<soap:header></soap:header>
113<soap:body>
114<m:getsalestaxresponse xmlns:m="urn:myserver/soap:TaxCalc">
115<salestax>4</salestax>
116</m:getsalestaxresponse>
117</soap:body>
118</soap:envelope>   
119  
120  
121  
122可以用字符串方式构造这个回应文件,也可以创建一个DOM对象,增加一个节点。   
123  
124文件返回给客户后,客户经过解码就能得到结果:   
125  
126Dim objReturn As New MSXML.DomDocument   
127  
128objReturn.LoadXML strReturn   
129  
130strQuery = _   
131  
132"SOAP:Envelope/SOAP:Body/m:GetSalesTaxResponse/SalesTax"   
133  
134dblTax = objReturn.SelectSingleNode(strQuery).Text   
135  
136  
137  
138这样就完成了一个简单的SOAP服务应用。虽然Visual Studio 7掩盖了内在的SOAP协议,但我希望本文有助于理解SOAP的操作过程。   
139  
140  
141  
142下面是客户端VB代码:   
143  
144VB Client Code   
145  
146Sub Main()   
147  
148Dim objHTTP As New MSXML.XMLHTTPRequest   
149  
150Dim strEnvelope As String   
151  
152Dim strReturn As String   
153  
154Dim objReturn As New MSXML.DOMDocument   
155  
156Dim dblTax As Double   
157  
158Dim strQuery As String   
159  
160  
161  
162'创建SOAP封装   
163  
164strEnvelope = _   
165  
166"<soap:envelope urn:schemas-xmlsoap-org:soap.v1""="" xmlns:soap="">" = _   
167  
168"<soap:header></soap:header>" = _   
169  
170"<soap:body>" = _   
171  
172"<m:getsalestax soap:taxcalculator""="" urn:myserver="" xmlns:m="">" = _   
173  
174"<salestotal>100</salestotal>" = _   
175  
176"</m:getsalestax>" = _   
177  
178"</soap:body>" = _   
179  
180"</soap:envelope>"   
181  
182  
183  
184'设定发往本地服务器   
185  
186objHTTP.open "post", "http://localhost/soap.asp", False   
187  
188  
189  
190'设定标准SOAP/ XML格式   
191  
192objHTTP.setRequestHeader "Content-Type", "text/xml"   
193  
194  
195  
196'设置调用函数头   
197  
198objHTTP.setRequestHeader "SOAPMethodName", _   
199  
200"urn:myserver/soap:TaxCalculator#GetSalesTax"   
201  
202  
203  
204'SOAP呼叫   
205  
206objHTTP.send strEnvelope   
207  
208  
209  
210'取出返回信封   
211  
212strReturn = objHTTP.responseText   
213  
214  
215  
216'加载到DOM   
217  
218objReturn.loadXML strReturn   
219  
220  
221  
222'查询返回值   
223  
224strQuery = _   
225  
226"SOAP:Envelope/SOAP:Body/m:GetSalesTaxResponse/SalesTax"   
227  
228dblTax = objReturn.selectSingleNode(strQuery).Text   
229  
230  
231  
232Debug.Print dblTax   
233  
234End Sub   
235  
236  
237  
238  
239  
240下面是服务端ASP代码(文件名soap.asp,存放在本地服务器根目录下):   
241  
242&lt;%   
243  
244Set objReq = Server.CreateObject("Microsoft.XMLDOM")   
245  
246  
247  
248'加载请求到XML DOM   
249  
250objReq.Load Request   
251  
252  
253  
254'按照输入参数查询   
255  
256strQuery = "SOAP:Envelope/SOAP:Body/m:GetSalesTax/SalesTotal"   
257  
258varSalesTotal = objReq.SelectSingleNode(strQuery).Text   
259  
260  
261  
262'计算   
263  
264varSalesTax = varSalesTotal * 0.04   
265  
266  
267  
268'准备返回信封   
269  
270strTmp = _   
271  
272"<soap:envelope urn:schemas-xmlsoap-org:soap.v1""="" xmlns:soap="">" = _   
273  
274"<soap:header></soap:header>" = _   
275  
276"<soap:body>" = _   
277  
278"<m:getsalestaxresponse soap:taxcalc""="" urn:myserver="" xmlns:m="">" = _   
279  
280"<salestax>" = varSalesTax = "</salestax>" = _   
281  
282"</m:getsalestaxresponse>" = _   
283  
284"</soap:body>" = _   
285  
286"</soap:envelope>"</getsalestax></getsalestax>
Published At
Categories with Web编程
Tagged with
comments powered by Disqus