You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在VBA中构建包含Schema的SOAP API请求?

如何在VBA中构建包含Schema的SOAP API请求?

嘿,我完全懂你现在的困惑——SOAP和REST简直是两个路子,尤其是VBA里各种零散的教程看得人头大。你之前的测试代码只是成功连通了服务,但还没真正发送带业务逻辑的SOAP请求,下面我一步步给你拆解怎么加上包含Schema(也就是命名空间)的请求体:

首先得明确几个SOAP的核心要点:

  • SOAP请求几乎都是POST方法(GET一般只能用来拉取WSDL或者测试连通性)
  • 必须设置正确的请求头,尤其是Content-Type和SOAPAction
  • 请求体是严格的XML格式,必须包含服务要求的命名空间(也就是你说的Schema相关部分)

针对你用的那个NumberConversion测试服务,我给你写个完整的可运行示例,注释里讲清楚每一步:

Sub TestSOAPRequestWithSchema()
    Dim http As New XMLHTTP60
    Dim soapRequest As String
    Dim xmlDoc As Object
    Dim responseNode As Object
    
    ' 1. 构造SOAP请求体,这里的命名空间(xmlns:web)就是Schema相关的核心
    ' 命名空间必须和目标服务WSDL里定义的完全一致,不然服务识别不了你的请求
    soapRequest = "<soap:Envelope xmlns:soap=""http://schemas.xmlsoap.org/soap/envelope/"" " & _
                  "xmlns:web=""http://www.dataaccess.com/webservicesserver/"">" & _
                  "<soap:Body>" & _
                  ' 调用服务的NumberToWords方法,参数ubiNum要带上web前缀
                  "<web:NumberToWords>" & _
                  "<web:ubiNum>123</web:ubiNum>" & _
                  "</web:NumberToWords>" & _
                  "</soap:Body>" & _
                  "</soap:Envelope>"
    
    With http
        ' 2. 打开POST请求,注意SOAP服务几乎不用GET
        .Open "POST", "https://www.dataaccess.com/webservicesserver/NumberConversion.wso", False
        
        ' 3. 设置关键请求头
        .setRequestHeader "Content-Type", "text/xml; charset=utf-8" ' 指定请求体是XML格式
        ' SOAPAction头用来告诉服务要调用哪个方法,值从WSDL文档里找
        .setRequestHeader "SOAPAction", "http://www.dataaccess.com/webservicesserver/NumberToWords"
        
        ' 4. 发送构造好的XML请求体
        .send soapRequest
        
        ' 5. 解析响应XML
        Set xmlDoc = CreateObject("MSXML2.DOMDocument")
        xmlDoc.async = False ' 同步加载,避免异步问题
        xmlDoc.LoadXML .responseText ' 用responseText或responseXML都可以,看服务返回
        
        ' 6. 提取响应结果,XPath要带上对应的命名空间前缀
        Set responseNode = xmlDoc.SelectSingleNode("//web:NumberToWordsResult")
        If Not responseNode Is Nothing Then
            MsgBox "数字转换结果:" & responseNode.Text
        Else
            MsgBox "未找到响应节点,可能请求格式有误,请检查XML和命名空间"
        End If
    End With
    
    ' 清理对象,避免内存泄漏
    Set http = Nothing
    Set xmlDoc = Nothing
    Set responseNode = Nothing
End Sub

再给你划几个重点:

  • 命名空间(Schema):你提到的Schema其实就是SOAP的命名空间,每个SOAP服务都有自己的命名空间,必须在Envelope里声明,所有请求参数节点都要带上对应的前缀(比如示例里的web:),这个信息可以从服务的WSDL文档里找到。
  • SOAPAction头:很多SOAP服务要求这个头来定位要调用的方法,值一般是方法的完整命名空间路径,同样可以从WSDL里查。
  • XML格式校验:如果请求总是失败,可以把构造的soapRequest输出到记事本里,检查标签是否闭合、前缀是否正确,也可以用xmlDoc.validateOnParse = True来开启XML校验,方便调试错误。

备注:内容来源于stack exchange,提问作者Drawleeh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.20 12:05:28