如何在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
相关产品推荐
相关产品推荐

