从VBA Excel for Mac发送HTTP Post中的数据

时间:2015-11-27 18:33:22

标签: excel macos vba excel-vba

所以我在Excel for Mac中有一项任务,使用VBA:

按下按钮,我需要从Excel中的工作表中读取数据,解析值并将它们导出到Web服务器,Web服务器读取数据并将其写入服务器上的文件中。在Windows上,一切顺利,使用MSXML2.ServerXMLHTTP和所有,但在Mac上不可能这样做(这种对象是ActiveX的一部分)。

Set objHttp = CreateObject("MSXML2.ServerXMLHTTP")
objHttp.SetOption 2, objHttp.GetOption(2) - SXH_SERVER_CERT_IGNORE_ALL_SERVER_ERRORS
objHttp.Open "POST", myURL, False
objHttp.SetRequestHeader "User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)"
objHttp.SetRequestHeader "Content-type", "application/x-www-form-urlencoded"
objHttp.SetRequestHeader "Authorization", "Basic " & Base64Encode(Username & ":" & Password)
objHttp.Send (strOutput)

从这个帖子:How can I send an HTTP POST request to a server from Excel using VBA?,我尝试使用查询表但没有任何成功(我总是遇到“找不到服务器”错误,即使我三重检查了地址等等。)

With ActiveSheet.QueryTables.Add(Connection:="URL;https://myurl.com/index.php", Destination:=Range("K1"))
    .PostText = strOutput
    .RefreshStyle = xlOverwriteCells
    .SaveData = True
    .Refresh
End With

我也尝试通过curl命令发送数据,但我似乎无法找到如何在VBA中正确执行它。

 sCmd = "curl " & _
        "-u " & Username & ":" & Password & _
        " -d " & Chr(34) & data & Chr(34) & _
        " " & url

因此,如果有人知道我应该如何完成这项任务,我将非常感激。非常感谢。

编辑:添加了我失败的尝试

2 个答案:

答案 0 :(得分:0)

好的,所以我做了进一步的研究,我终于找到了一些有用的东西,使用cURL。为了实现它,我们必须创建一个这样的函数(这是我在VBA Shell function in Office 2011 for Mac找到的函数):

Private Declare Function popen Lib "libc.dylib" (ByVal command As String, ByVal mode As String) As Long
Private Declare Function pclose Lib "libc.dylib" (ByVal file As Long) As Long
Private Declare Function fread Lib "libc.dylib" (ByVal outStr As String, ByVal size As Long, ByVal items As Long, ByVal stream As Long) As Long
Private Declare Function feof Lib "libc.dylib" (ByVal file As Long) As Long

Function execShell(command As String, Optional ByRef exitCode As Long) As String
    Dim file As Long
    file = popen(command, "r")

    If file = 0 Then
        Exit Function
    End If

    While feof(file) = 0
        Dim chunk As String
        Dim read As Long
        chunk = Space(50)
        read = fread(chunk, 1, Len(chunk) - 1, file)
        If read > 0 Then
            chunk = Left$(chunk, read)
            execShell = execShell & chunk
        End If
    Wend

    exitCode = pclose(file)
End Function

基本上,这个函数允许我们在Mac上调用shell命令,而不必经历将Mac命令转换为Windows格式的所有困难。

完成此操作后,调用此函数时,第一个参数是命令行(采用cURL格式),第二个参数是系统返回的退出代码(而不是cURL请求!)。然后cURL命令将返回http响应。所以这样的事情会起作用:

Dim command As String
command = "usr/bin/curl http://www.myserver.com -d "data" -X POST ..."

Dim exitCode As Long
Dim result As String

result = execShell(command, exitCode)

注意我是如何开始我的cURL请求的。您必须编写cURL的路径(在本例中为“usr / bin / curl”),以便系统找到cURL的位置,否则它将无法工作(它可能会起作用,但这样我们确保它始终工作)

跨平台兼容性

请注意,如果它在Windows上,这个解决方案不起作用,因为它没有“libc.dylib”库,因此您必须检查操作系统并实现在Windows上执行此操作的方法(如问题所述)

Set objHttp = CreateObject("MSXML2.ServerXMLHTTP")
objHttp.SetOption 2, objHttp.GetOption(2) - SXH_SERVER_CERT_IGNORE_ALL_SERVER_ERRORS
objHttp.Open "POST", myURL, False
objHttp.SetRequestHeader "User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)"
objHttp.SetRequestHeader "Content-type", "application/x-www-form-urlencoded"
objHttp.SetRequestHeader "Authorization", "Basic " & Base64Encode(Username & ":" & Password)
objHttp.Send (strOutput)

答案 1 :(得分:0)

对于比Mac Excel 2011更高的版本,我建议这样做。

假设我们通过POST操作调用“http://example.com?q=hello&t=now”。

Private Declare PtrSafe Function system Lib "libc.dylib" (ByVal command As String) As Long

Function getHTTPPost(sUrl As String, sQuery As String) As Long

    sCmd = "curl -v -X POST -d '" & sQuery & "' " & sUrl
    exitCode = system(sCmd)

End Sub

然后,我们可以使用以下:

ans = getHTTPPost("http://example.com", "q=hello&t=now")

但是,我们想要考虑到我们无法通过此代码获取响应字符串。

希望这可以帮助您关注Office 2016的Mac VBA中的HTTP Post Request。