新书推介:《语义网技术体系》
作者:瞿裕忠,胡伟,程龚
   XML论坛     W3CHINA.ORG讨论区     计算机科学论坛     SOAChina论坛     Blog     开放翻译计划     新浪微博  
 
  • 首页
  • 登录
  • 注册
  • 软件下载
  • 资料下载
  • 核心成员
  • 帮助
  •   Add to Google

    >> XML与e-Business, e-Government
    [返回] 中文XML论坛 - 专业的XML技术讨论区XML.ORG.CN讨论区 - 高级XML应用『 XML在电子商务与电子政务中的应用 』 → 一个简单的SOAP服务端和一个客户端 查看新帖用户列表

      发表一个新主题  发表一个新投票  回复主题  (订阅本版) 您是本帖的第 35447 个阅读者浏览上一篇主题  刷新本主题   树形显示贴子 浏览下一篇主题
     * 贴子主题: 一个简单的SOAP服务端和一个客户端 举报  打印  推荐  IE收藏夹 
       本主题类别:     
     yibingzheng 帅哥哟,离线,有人找我吗?
      
      
      威望:5
      头衔:一兵征
      等级:研一(帮老板干活拿了2000元)
      文章:818
      积分:4280
      门派:XML.ORG.CN
      注册:2004/4/30

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给yibingzheng发送一个短消息 把yibingzheng加入好友 查看yibingzheng的个人资料 搜索yibingzheng在『 XML在电子商务与电子政务中的应用 』的所有贴子 访问yibingzheng的主页 引用回复这个贴子 回复这个贴子 查看yibingzheng的博客楼主
    发贴心情 一个简单的SOAP服务端和一个客户端

    如果想了解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文件里有调用的函数名和相应的参数:
          <GetSalesTax>
              <SalesTotal>100</SalesTotal>
          <GetSalesTax>

    为确保服务器能够识别和解释客户请求,呼叫指令被包装到一个称之为SOAP信封的大文件里。这个信封使用的是SOAP封装标准的通用命名空间:
          <SOAP:Envelope xmlns:SOAP="urn:schemas-xmlsoap-org:soap.v1">
              <SOAP:Header></SOAP:Header>
              <SOAP:Body>
                  <GetSalesTax>
                      <SalesTotal>100</SalesTotal>
                  <GetSalesTax>
              </SOAP:Body>
          </SOAP:Envelope>

    最后,加入函数调用的命名空间,起到函数声明的作用:
          <SOAP:Envelope xmlns:SOAP="urn:schemas-xmlsoap-org:soap.v1">
              <SOAP:Header></SOAP:Header>
              <SOAP:Body>
                  <m:GetSalesTax xmlns:m="urn:myserver/soap:TaxCalc">
                      <SalesTotal>100</SalesTotal>
                  </m:GetSalesTax>
              </SOAP:Body>
          </SOAP:Envelope>

    现在,已经准备好客户请求文件,可以送往服务端了。发送请求很简单,可以跟浏览器表单一样,用HTTP  post方式。浏览器可以向服务端发送复杂的表单,.NET可以向服务器发送VB代码,但我使用XMLHTTP(IE 5以上版本才能用)。

    假设strEnvelope含有XML文件格式的请求,发送格式如下:
          Dim objHTTP As New MSXML.XMLHTTPRequest
          Dim strEnvelope As String

          '设定发往本地服务器
          objHTTP.open "post", "http://localhost/soap/soap.asp"

          '设定标准SOAP/ XML文件头格式
          objHTTP.setRequestHeader "Content-Type", "text/xml"

          '设置呼叫函数请求
          objHTTP.setRequestHeader "SOAPMethodName", _
              "urn:myserver/soap:TaxCalc#GetSalesTax"

          '呼叫SOAP
          objHTTP.send strEnvelope

          '取得返回值
          strReturn = objHTTP.responseBody

    至此,客户端完成了向服务端发送请求的过程。现在回到服务端,看看服务端如何侦听客户请求并作出响应。

    服务端
    服务端要能够接收客户发出的HTTP请求,在本地服务器(http://localhost/soap.asp)接收到客户请求时作出回应。因此服务端要能够解析客户端发出的XML格式(SOAP封装)的请求,取出调用的函数名和参数。

    服务端文件是soap.asp,它接收客户请求的做法是:
          Set objReq = Server.CreateObject("Microsoft.XMLDOM")
          objReq.Load Request

    然后用XSL样式从封装的XML文件中取出参数:
          strQuery = "SOAP:Envelope/SOAP:Body/m:GetSalesTax/SalesTotal"
          varSalesTotal = objReq.SelectSingleNode(strQuery).Text

    根据参数计算税款:
          varSalesTax = varSalesTotal * 0.04

    在将结果返回给客户之前,要按SOAP标准做格式化封装。过程与客户端类似,只是把"IN"参数改换为"OUT"参数,并将函数标记名标为回应:
          <SOAP:Envelope xmlns:SOAP="urn:schemas-xmlsoap-org:soap.v1">
             <SOAP:Header></SOAP:Header>
             <SOAP:Body>
                <m:GetSalesTaxResponse xmlns:m="urn:myserver/soap:TaxCalc">
                   <SalesTax>4</SalesTax>
                </m:GetSalesTaxResponse>
             </SOAP:Body>
          </SOAP:Envelope>

    可以用字符串方式构造这个回应文件,也可以创建一个DOM对象,增加一个节点。
    文件返回给客户后,客户经过解码就能得到结果:
          Dim objReturn As New MSXML.DomDocument
          objReturn.LoadXML strReturn
          strQuery = _
            "SOAP:Envelope/SOAP:Body/m:GetSalesTaxResponse/SalesTax"
          dblTax = objReturn.SelectSingleNode(strQuery).Text

    这样就完成了一个简单的SOAP服务应用。虽然Visual Studio 7掩盖了内在的SOAP协议,但我希望本文有助于理解SOAP的操作过程。

    下面是客户端VB代码:
          VB Client Code
          Sub Main()
            Dim objHTTP As New MSXML.XMLHTTPRequest
            Dim strEnvelope As String
            Dim strReturn As String
            Dim objReturn As New MSXML.DOMDocument
            Dim dblTax As Double
            Dim strQuery As String
            
            '创建SOAP封装
            strEnvelope = _
              "<soap:envelope xmlns:soap=""urn:schemas-xmlsoap-org:soap.v1"">" & _
              "<soap:header></soap:header>" & _
              "<soap:body>" & _
              "<m:getsalestax xmlns:m=""urn:myserver/soap:TaxCalculator"">" & _
              "<salestotal>100</salestotal>" & _
              "</m:getsalestax>" & _
              "</soap:body>" & _
              "</soap:envelope>"
            
            '设定发往本地服务器
            objHTTP.open "post", "http://localhost/soap.asp", False
            
            '设定标准SOAP/ XML格式
            objHTTP.setRequestHeader "Content-Type", "text/xml"
            
            '设置调用函数头
            objHTTP.setRequestHeader "SOAPMethodName", _
              "urn:myserver/soap:TaxCalculator#GetSalesTax"
            
            'SOAP呼叫
            objHTTP.send strEnvelope
            
            '取出返回信封
            strReturn = objHTTP.responseText
            
            '加载到DOM
            objReturn.loadXML strReturn
            
            '查询返回值
            strQuery = _
              "SOAP:Envelope/SOAP:Body/m:GetSalesTaxResponse/SalesTax"
            dblTax = objReturn.selectSingleNode(strQuery).Text
            
            Debug.Print dblTax
          End Sub
         
         
         下面是服务端ASP代码(文件名soap.asp,存放在本地服务器根目录下):
          <%
          Set objReq = Server.CreateObject("Microsoft.XMLDOM")

          '加载请求到XML DOM
          objReq.Load Request

          '按照输入参数查询
          strQuery = "SOAP:Envelope/SOAP:Body/m:GetSalesTax/SalesTotal"
          varSalesTotal = objReq.SelectSingleNode(strQuery).Text

          '计算
          varSalesTax = varSalesTotal * 0.04

          '准备返回信封
          strTmp = _
          "<soap:envelope xmlns:soap=""urn:schemas-xmlsoap-org:soap.v1"">" & _
          "<soap:header></soap:header>" & _
          "<soap:body>" & _
          "<m:getsalestaxresponse xmlns:m=""urn:myserver/soap:TaxCalc"">" & _
          "<salestax>" & varSalesTax & "</salestax>" & _
          "</m:getsalestaxresponse>" & _
          "</soap:body>" & _
          "</soap:envelope>"

          '回写结果文件
          Response.Write strTmp
          %>


       收藏   分享  
    顶(1)
      




    ----------------------------------------------
    如果我不为自己打算,那么谁为我打算。如果我只为自己打算,那么我又算什么。

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2005/1/4 16:48:00
     
     zcy1996 帅哥哟,离线,有人找我吗?
      
      
      等级:大一(猛啃高等数学)
      文章:9
      积分:110
      门派:XML.ORG.CN
      注册:2004/6/11

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给zcy1996发送一个短消息 把zcy1996加入好友 查看zcy1996的个人资料 搜索zcy1996在『 XML在电子商务与电子政务中的应用 』的所有贴子 引用回复这个贴子 回复这个贴子 查看zcy1996的博客2
    发贴心情 
    写的不错,使我这样的初学者也能看懂,顶!
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2005/1/5 23:06:00
     
     cwzb 帅哥哟,离线,有人找我吗?双鱼座1981-3-10
      
      
      威望:4
      头衔:没有耳多
      等级:(版主)
      文章:253
      积分:1753
      门派:XML.ORG.CN
      注册:2004/1/15

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给cwzb发送一个短消息 把cwzb加入好友 查看cwzb的个人资料 搜索cwzb在『 XML在电子商务与电子政务中的应用 』的所有贴子 访问cwzb的主页 引用回复这个贴子 回复这个贴子 查看cwzb的博客3
    发贴心情 
    好贴,强贴,我也学习一下:)

    如果在。NET里,那还可以加上反射效果就可以更加的好了:)

    ----------------------------------------------
    无能不多智不要紧。
    关键是肯学,感兴趣!

    送给我自己的话!

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2005/1/25 17:33:00
     
     nrkkim 帅哥哟,离线,有人找我吗?
      
      
      等级:大一新生
      文章:5
      积分:76
      门派:XML.ORG.CN
      注册:2004/6/3

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给nrkkim发送一个短消息 把nrkkim加入好友 查看nrkkim的个人资料 搜索nrkkim在『 XML在电子商务与电子政务中的应用 』的所有贴子 引用回复这个贴子 回复这个贴子 查看nrkkim的博客4
    发贴心情 
    太乱了,但是很简单:)
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2005/3/9 16:47:00
     
     4286 帅哥哟,离线,有人找我吗?
      
      
      等级:大一新生
      文章:0
      积分:55
      门派:XML.ORG.CN
      注册:2005/3/11

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给4286发送一个短消息 把4286加入好友 查看4286的个人资料 搜索4286在『 XML在电子商务与电子政务中的应用 』的所有贴子 引用回复这个贴子 回复这个贴子 查看4286的博客5
    发贴心情 
    真的不错!收益非浅!
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2005/3/11 21:09:00
     
     yulinchen139 帅哥哟,离线,有人找我吗?
      
      
      等级:大一(猛啃高等数学)
      文章:11
      积分:104
      门派:XML.ORG.CN
      注册:2004/12/17

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给yulinchen139发送一个短消息 把yulinchen139加入好友 查看yulinchen139的个人资料 搜索yulinchen139在『 XML在电子商务与电子政务中的应用 』的所有贴子 引用回复这个贴子 回复这个贴子 查看yulinchen139的博客6
    发贴心情 
    学习ing
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2005/6/24 0:05:00
     
     billy2000 帅哥哟,离线,有人找我吗?
      
      
      等级:大一(猛啃高等数学)
      文章:14
      积分:141
      门派:XML.ORG.CN
      注册:2004/5/24

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给billy2000发送一个短消息 把billy2000加入好友 查看billy2000的个人资料 搜索billy2000在『 XML在电子商务与电子政务中的应用 』的所有贴子 引用回复这个贴子 回复这个贴子 查看billy2000的博客7
    发贴心情 

    出错!!!!!!!!!!!!!!!!

    ?strReturn
    <font face="??" size=2>
    <p>Microsoft VBScript ?????</font> <font face="??" size=2>?? '800a01a8'</font>
    <p>
    <font face="??" size=2>?????objReq.SelectSingleNode(...)'</font>
    <p>
    <font face="??" size=2>/adv/soap/soap.asp</font><font face="??" size=2>??? 9</font>

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2005/6/29 15:22:00
     
     billy2000 帅哥哟,离线,有人找我吗?
      
      
      等级:大一(猛啃高等数学)
      文章:14
      积分:141
      门派:XML.ORG.CN
      注册:2004/5/24

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给billy2000发送一个短消息 把billy2000加入好友 查看billy2000的个人资料 搜索billy2000在『 XML在电子商务与电子政务中的应用 』的所有贴子 引用回复这个贴子 回复这个贴子 查看billy2000的博客8
    发贴心情 
    问题解决了 呵呵
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2005/6/29 15:50:00
     
     billy2000 帅哥哟,离线,有人找我吗?
      
      
      等级:大一(猛啃高等数学)
      文章:14
      积分:141
      门派:XML.ORG.CN
      注册:2004/5/24

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给billy2000发送一个短消息 把billy2000加入好友 查看billy2000的个人资料 搜索billy2000在『 XML在电子商务与电子政务中的应用 』的所有贴子 引用回复这个贴子 回复这个贴子 查看billy2000的博客9
    发贴心情 
    有需要的 可以给我写EMAIL boys@263.net
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2005/6/29 15:54:00
     
     linkyo 帅哥哟,离线,有人找我吗?
      
      
      等级:大一(高数修炼中)
      文章:8
      积分:114
      门派:XML.ORG.CN
      注册:2005/3/3

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给linkyo发送一个短消息 把linkyo加入好友 查看linkyo的个人资料 搜索linkyo在『 XML在电子商务与电子政务中的应用 』的所有贴子 引用回复这个贴子 回复这个贴子 查看linkyo的博客10
    发贴心情 
    收益非浅!好贴!!
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2005/8/5 10:34:00
     
     GoogleAdSense
      
      
      等级:大一新生
      文章:1
      积分:50
      门派:无门无派
      院校:未填写
      注册:2007-01-01
    给Google AdSense发送一个短消息 把Google AdSense加入好友 查看Google AdSense的个人资料 搜索Google AdSense在『 XML在电子商务与电子政务中的应用 』的所有贴子 访问Google AdSense的主页 引用回复这个贴子 回复这个贴子 查看Google AdSense的博客广告
    2024/4/27 15:18:20

    本主题贴数11,分页: [1] [2]

    管理选项修改tag | 锁定 | 解锁 | 提升 | 删除 | 移动 | 固顶 | 总固顶 | 奖励 | 惩罚 | 发布公告
    W3C Contributing Supporter! W 3 C h i n a ( since 2003 ) 旗 下 站 点
    苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
    195.313ms