VBA中SOAP Web Service的HTTP Basic认证请求失败排查
我在VBA中调用SOAP Web Service时,请求无法通过HTTP Basic认证环节。已知密钥和密码有效(其他代码可正常访问该服务),怀疑问题出在请求头或认证流程中。明确Content-Type头需设为text/xml,认证采用Basic HTTP Authentication形式。以下是认证相关VBA代码(敏感信息已替换为*****):
Sub CreateShip() Dim request As New MSXML2.XMLHTTP60 Dim sEnv As String Dim response As New MSXML2.DOMDocument60 Dim key As String key = "*****" Dim pswd As String pswd = "*****" With request .Open "Get", "https://devwebservices.purolator.com/EWS/V2/shipping/Shippingservice.wsdl", False .setRequestHeader "Content-Type", "text/xml" .setRequestHeader "Authorization", "Basic " & EncBase64(key & ":" & pswd) ' Request Envelope .send End With End Sub Function EncBase64(strData As String) As String Dim objXML As MSXML2.DOMDocument60 Dim objNode As MSXML2.IXMLDOMElement Dim arData() As Byte arData = StrConv(strData, vbFromUnicode) Set objXML = New MSXML2.DOMDocument60 Set objNode = objXML.createElement("b64") objNode.DataType = "bin.base64" objNode.nodeTypedValue = arData EncBase64 = objNode.Text Set objNode = Nothing Set objXML = Nothing 'Debug.Print strData 'Debug.Print EncBase64 End Function
排查点与解决建议
请求方法错误:SOAP请求标准方法为
POST而非GET,当前代码使用Get会导致服务无法正确接收SOAP信封。需将.Open的第一个参数改为"POST",并在.send方法中传入SOAP信封内容sEnv,即.send sEnv。完善Content-Type头:SOAP 1.1规范要求Content-Type需包含编码声明,建议改为
text/xml; charset=utf-8,同时确保头设置在.Open之后、.send之前。验证Base64编码正确性:取消
EncBase64函数中的注释,打印编码结果,与手动用Base64工具编码key:pswd的结果对比。若不一致,检查StrConv(strData, vbFromUnicode)是否适配密钥和密码的编码格式,避免编码错误导致认证失败。简化认证方式:放弃手动构造Authorization头,改用
XMLHTTP内置的.setCredentials方法,在.Open之后添加:.setCredentials key, pswd, HTTPREQUEST_SETCREDENTIALS_FOR_SERVER该方法会自动处理Basic认证的编码与头设置,避免手动编码出错。
确保SOAP信封传入:当前代码中
sEnv未赋值也未传入.send,POST请求必须携带SOAP信封作为请求体,否则服务会因缺少核心请求数据拒绝认证。
内容的提问来源于stack exchange,提问作者KAtkinson

