在VBA

时间:2015-07-15 15:18:51

标签: vba excel-vba session excel

如果我的问题标题不正确,我很抱歉 - 我已经习惯了使用API​​进行PHP会话的想法。

我正在尝试使用以下代码在VBA中完成相同的专长:

'Login
strLogin = "https://URL.COM/authenticateUser?login=username&apiKey=password"
Set xmlHttp = CreateObject("MSXML2.ServerXMLHTTP.6.0")
xmlHttp.Open "GET", strLogin
xmlHttp.setRequestHeader "Content-Type", "text/xml"
xmlHttp.send

'Save the response to a string
strReturn = xmlHttp.responseText


'Open URL and get JSON data

strUrl = "https://URL.COM/Search/search?searchTerm=" & Keyword & "&mode=beginwith"
Set xmlHttp = CreateObject("MSXML2.ServerXMLHTTP.6.0")
xmlHttp.Open "GET", strUrl
xmlHttp.setRequestHeader "Content-Type", "text/xml"
xmlHttp.send

'Save the response to a string
strReturn = xmlHttp.responseText


Sheets(1).Cells(20, 2).Value = strReturn

使用此API,我需要在执行任何将返回数据的调用之前先登录。

我的问题是我无法确定如何“保持登录状态”以便我的第二次通话有效。

登录后,strReturn将填充以下字符串:

{"Status":{"Code":"2","Message":"Authentication Succeeded","Success":"true"}}

但是,当我开始使用strUrl时,我收到以下消息:

{"Status":{"Code":"1","Message":"Invalid User Name Or Password","Success":"false"}}

我在之前的项目中使用过此代码,我需要提供API密钥以及每个请求到服务器的URL - 所以这显然工作正常。我不确定如何使用xmlHttp实现“建立会话”的概念。

1 个答案:

答案 0 :(得分:5)

因此,对于遇到此问题的其他人来说,简单的解决方案是从第二次调用中删除以下行:

Set xmlHttp = CreateObject("MSXML2.ServerXMLHTTP.6.0")

通过不创建新对象,vba能够保留并使用第一次登录呼叫中的cookie。

最终代码如下:

'Login
strLogin = "https://URL.COM/authenticateUser?login=username&apiKey=password"
Set xmlHttp = CreateObject("MSXML2.ServerXMLHTTP.6.0")
xmlHttp.Open "GET", strLogin
xmlHttp.setRequestHeader "Content-Type", "text/xml"
xmlHttp.send

'Save the response to a string
strReturn = xmlHttp.responseText


'Open URL and get JSON data

strUrl = "https://URL.COM/Search/search?searchTerm=" & Keyword & "&mode=beginwith"
xmlHttp.Open "GET", strUrl
xmlHttp.setRequestHeader "Content-Type", "text/xml"
xmlHttp.send

'Save the response to a string
strReturn = xmlHttp.responseText


Sheets(1).Cells(20, 2).Value = strReturn

需要登录的API能够保持会话的建立。