VB实现Soap XML解析

VB调用WebService(直接Post方式)并解析返回的XML Function TodoTaskBySOAP(postURL As String,host As String, n As Integer,FilterItem() As String,OwnerSSICID() As String ,AppID() As String ,ToDoID() As String,Title() As String,Url() As String ,ExpireDa 阅读详情

http://bbs.blueidea.com/viewthread.php?tid=531257

 

如果想了解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
      %>
XML+XSD,SOAP和WSDL区别 XML+XSD,SOAP和WSDL就是构成WebService平台的三大技术。 XML+XSD: WebService采用HTTP协议传输数据,采用XML格式封装数据(即XML中说明调用远程服务对象的哪个方法,传递的参数是什么,以及服务对象的返回结果是什么)。XML是WebService平台中表示数据的格式。除了易于建立和易于分析外,XML主要的优点在于它既是平台无关的,又是厂商无关的。无关性是比... 阅读详情

相关推荐

Microsoft SOAP Toolkit 2.0介绍

写作本文的目的:近期看到CSDN上有很多介绍Dephi 6.0对于Web Service强力支持的文章,而 Microsoft Soap Toolkit 2.0的介绍相对较少。大家讨论的,基本还停留在用Visual Studio .NET开发一个简单的Web Service的水平上。而我认为,全面使用.NET开发似乎还不太现实,广大的VC/VB程序员要开发SOAP应用,看来还是需要使用Micros

optman的专栏 2297

XML SOAP应用简介

如果想了解SOAP到底是什么,就要自己动手建立自己的SOAP标准对象。本文可以帮助你起步。============================================简介SOAP - 简单对象处理协议(Simple Object Access Protocol) - 是当前XML开发的热点。它是微软新一代Visual Studio的主要角色,是".NET"策略的基础。如果想用VB

ChinaOk的专栏 1725

Ubuntu20.04安装NVIDIA显卡驱动避坑指南:从.run文件到完美运行

本文详细介绍了在Ubuntu20.04系统上通过.run文件安装NVIDIA显卡驱动的完整流程和避坑技巧。从禁用Nouveau驱动、选择合适显示管理器到处理常见安装问题,提供了一套经过验证的解决方案,帮助用户顺利完成驱动安装并优化性能。

weixin_30776273的博客 542

SOAP协议入门

SOAP(Simple Object Access Protocol)简单对象访问协议,是一种基于XML的交换结构数据的网络通信协议,是W3C推荐标准。 SOAP依赖于其他协议实现传输功能,最常见的就是HTTP,SOAP与HTTP组合被广泛应用于Web Services中,此外SMTP,JMS等协议(技术)也可以用于传输SOAP消息。SOAP由于基于XML,所以具有平台独立性,语言独立性,简单,易...

扶摇升的IT博客 2742

xmlns="http://schemas.xmlsoap.org/wsdl/",这是什么意思,我只知道:xmlns:xx=....,

表示没有prefix,相当于你的xsi为空。这个很常用,后面就省得每行都要加一个前缀了。 解决方案 » "后面就省得每行都要加一个前缀了",意思是,后面的子元素如果没有名称空间前缀,就是使用这个前缀了? "后面就省得每行都要加一个前缀了",意思是,后面的子元素如果没有名称空间前缀,就是使用这个前缀了?是的 ...

weixin_30236595的博客 1567

soap

简介就在不久以前,SOAP 还不过是指肥皂而已。 而如今,大多数开发人员一听到这个词眼前就会浮现出一些尖括号来。 SOAP 最初代表“简单对象访问协议”。 如果在几年前问任何一个人 SOAP 的含义,他们很可能这样回答:“SOAP 是用来使 DCOM 和 Corba(例如,RPC 调用)在互联网上工作”。 原作者们也承认,在那时他们注重于“访问对象”,但随着时间的推移,人们希望 SOAP 能够

2131

基于XMLSOAP协议

ONC RPC 存在哪些问题 ONC RPC将客户端要发送的参数,以及服务端要发送的回复,都压缩为一个二进制串,这样固然能够解决双方的协议约定问题,但是存在一定的不方便。 首先,需要双方的压缩格式完全一致,一点都不能差,一旦有少许的差错,多一位,少一位或者错一位,都可能无法解压缩,当然,我们可以用传输层的可靠性以及加入校验值等方式,来减少传输过程中的差错。 其次,协议修改不灵活,如果不是传输过程中...

凯凯王的技术生涯 6250

转: vb调用webservice 另一方法

转: http://hi.baidu.com/360930109/blog/item/fee87182b2376d96f703a659.html 利用SOAP协议首先,需要引用 microsoft xml 6.0在客户端调用时定义soap消息 这个消息可以在webservice调用过程获得。主要处理在soap12:Body   Dim strtest As String

James.Duan@CSDN 2285

soap和wsdl区别说明

Web Service实现业务诉求:Web Service是真正“办事”的那个,提供一种办事接口的统称。 WSDL提供“能办的事的文档说明”:对要提供的服务的一种描述格式。我想帮你的忙,但是我要告诉你我都能干什么,以及干这些事情需要的参数类型。 SOAP提供“请求”的规范:向服务接口传递请求的格式,包括方法和参数等。你想让人家办事,总得告诉人家你想干什么吧,SOAP就是定义这个“请求”的格式的,按...

漫天雪_昆仑巅 1万+

使用Soap Toolkit及Soap协议访问WebService

本文使用的soap toolkit 3.0直接上VB代码: Sub SoapMethod() On Error GoTo errhandler '方法1:使用soap toolkit,此方法需要安装soap toolkit3.0 Dim soapclient As Object Set soapclient = CreateObject("MSSOAP.SoapClient...

weixin_43926268的博客 1735

VB6SOAP

根据网上搜来的资料,MS有个组件可以用来支撑VB6访问SOAP接口。 于是下载了个msSoapToolkit.exe安装后试了下,发现确实可以访问用C#或者VB.net写的webservice。 但是如果接口是使用其他语言编写的,则会出现各种莫名错误,像什么参数类型不正确,或者初始化失败(应该是解析WSDL报文的时候造成的)。 不管怎样,总归是为VB6提供了一种访问webservice的方式...

weixin_30830327的博客 372

使用Soap消息调用Web Services

简介: Web Services技术使异种计算环境之间可以共享数据和通信,达到信息的一致性。随着异种计算机环境的不断增加,我们会更加经常的调用各种不同计算机体系中编写和发布的Web Services,作者在本文中给出了使用VB应用程序调用java平台编写和发布的Web Services的实践过程, 并且分析了如何根据WSDL文件构造SOAP消息的方法。 一 SOAP简介 1.SOAP定义 S

chj225500的专栏 589

VB6 采用SOAP协议进行提交/返回数据

新建 VB6 项目工程 引用 Microsoft XML , 添加CommandButton命名为cmdRequest ,添加 TextBox 命名为 txtResponseHeaders,添加 TextBox 命名为 txtResponse---------------------------------------------------------- Option ExplicitPriv

VisionSpace的专栏 1272

接口测试之(二)WebService 之 WSDL文件 讲解

WebService 之 WSDL文件 讲解 恩,我想说的是,是不是经常有人在开发的时候,特别是和第三方有接口的时候,走的是SOAP协议,然后用户给你一个WSDL文件,说按照上面的进行适配,嘿嘿,这个时候,要是你以前没有开发过,肯定会傻眼,那如果你想学习的话,就认真的看下面的讲解咯: 一、WSDL概述 WebServices Description Language (...

ths512的博客 3239

通向架构师的道路(第十二天)之Axis2 Web Service(三)

一、SOAPIn Axis2 在前两天的教程中,我们学习到了用Axis2如何进行复杂数据、简单数据进行传输。 正如我在前一天教程中所说,在web service的世界里,一切都是基于SOAP的,因此在今天我们将学习Axis2中的SOAP特性。 今天的课程将用3个例子来完成即: 1)客户端与服务端使用SOAP进行通讯 2)服务端将Exception以SOAPFault的形式抛给客户端 3...

iteye_6378的博客 299

最简单的vb6访问Web服务(WSDL)的组件

(声明:魏滔序原创,转贴请注明出处。) 闲暇之余写了这个SOAP组件,下载试用的请回复一下。请把你试用中遇到的问题告诉我,我完善后开源。下载地址:http://www.chenoe.com/developer/library/soap.dll示例代码:Option ExplicitPrivate WithEvents SOAP As SOAPClientPrivate Sub Command1

迈克揉索芙特 1万+

"http://schemas.xmlsoap.org/wsdl/", the namespace on the "definitions" element, is not a valid SOAP

org.apache.cxf.binding.soap.SoapFault: "http://schemas.xmlsoap.org/wsdl/", the namespace on the "definitions" element, is not a valid SOAP version. 今天对端调服务端报上面错误, 对端调用代码: org.apache.cxf.binding.s

乘风晓栈的博客 3829

LAMMPS实操系列(一): 大量FCC-CoCrCuFeNi高熵合金建模与最稳定结构筛选

高熵合金(High-entropy alloys,HEA),是由五种或五种以上等量或大约等量金属形成的合金。由于高熵合金可能具有许多优秀的物理化学性质,因此在材料科学领域受到广泛关注

Ceshigo_CD的博客 3228

FTDI FT232H硬件 工具

FTDI-Oh-MyFTDI FT232H tools for hardware hacking

上一篇: SOAP协议规范
下一篇: 深入探讨SOAP、RPC和RMI
yangdelong
博客等级 码龄20年 380粉丝 29原创
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值