我正在为Access使用更长的脚本,有一次需要检查Web服务中文件的最新版本(文件名)。只能通过具有https://webservice.example.com:1234/Server/test.jsp?parameter=value
之类的URL的浏览器访问此Web服务,然后必须使用弹出的标准浏览器用户名密码进行身份验证。
当然,如果我改用https://user:password@webservice.example.com:1234/Server/test.jsp?parameter=value
之类的方法,则可以跳过此弹出窗口。 (请注意,此时的安全性与密码无关,仅是为了拥有密码而存在,并且完全可以将其存储为明文)
此刻,我已经使用以下工作代码从另一个代码中获取信息 网站:
Dim appIE As Object
Dim sURL as String, infoStr as String
Set appIE = GetObject("new:{D5E8041D-920F-45e9-B8FB-B1DEB82C6E5E}") 'class id of InternetExplorerMedium
sURL = "https://webservice.example.com:1234/Server/test.jsp?parameter=value"
With appIE
.Navigate sURL
.Visible = False
End With
Do While appIE.Busy Or appIE.ReadyState <> 4
DoEvents
Loop
infoStr = appIE.Document.getElementsByTagName("body").item.innerText
但是,如果我像在浏览器中那样将凭据添加到URL,
sURL = "https://user:password@webservice.example.com:1234/Server/test.jsp?parameter=value"
我将收到以下错误:
运行时错误'-2146697202(800c000e)':对象的方法'navigate' “ IWebBrowser2”失败
有人知道我添加凭据的原因为什么会失败,或者有人知道如何以不同的方式进行操作吗?
答案 0 :(得分:1)
如果您的网站需要基本身份验证,则使用基本身份验证标头进行身份验证相对容易。
我们需要能够对内容进行Base64编码,因此首先我们需要为此定义一个辅助函数:
Public Function ToBase64(Bytes() As Byte) As String
Dim XMLElement As Object
Set XMLElement = CreateObject("Msxml2.DOMDocument.6.0").createElement("tmp")
XMLElement.DataType = "bin.base64"
XMLElement.nodeTypedValue = Bytes
ToBase64 = Replace(XMLElement.Text, vbLf, "")
End Function
然后是创建基本身份验证标头的第二个助手:
Public Function CreateBasicAuthHeader(Username As String, Password As String) As String
'Assuming ASCII encoding, UTF-8 is harder
CreateBasicAuthHeader = "Authorization: Basic " & ToBase64(StrConv(Username & ":" & Password, vbFromUnicode))
End Function
快速验证显示?CreateBasicAuthHeader("Aladdin", "OpenSesame")
返回Authorization: Basic QWxhZGRpbjpPcGVuU2VzYW1l
,这是根据Wikipedia的预期标头
然后,您可以在Navigate
方法中使用它:
Dim appIE As Object
Dim sURL as String, infoStr as String
Set appIE = GetObject("new:{D5E8041D-920F-45e9-B8FB-B1DEB82C6E5E}") 'class id of InternetExplorerMedium
sURL = "https://webservice.example.com:1234/Server/test.jsp?parameter=value"
With appIE
.Navigate sURL, Headers:=CreateBasicAuthHeader("MyUsername", "MyPassword")
.Visible = False
End With
Do While appIE.Busy Or appIE.ReadyState <> 4
DoEvents
Loop
infoStr = appIE.Document.getElementsByTagName("body").item.innerText
这假设服务器要么期望ASCII编码,要么您的用户名和密码都只是ASCII字符,并且服务器期望UTF-8编码。