如何使用 VBA 从 Excel 向服务器发送 HTTP POST 请求?

从 Excel 电子表格执行 HTTP POST 需要的 VBA 代码是啥?

333881 次浏览

通过添加对 MSXML的引用,可以在 VBA 项目中使用 ServerXMLHTTP

  1. 打开 VBA 编辑器(通常通过编辑宏)
  2. 转到可用参考文献列表
  3. 检查 MicrosoftXML
  4. 单击 OK。

(来自 在 VBA 项目中引用 MSXML)

ServerXMLHTTP MSDN 文档有关于 ServerXMLHTTP 的所有属性和方法的详细信息。

简而言之,它的工作原理基本上是这样的:

  1. 调用 打开方法以连接到远程服务器
  2. 调用 发送发送请求。
  3. 通过 Response seXML回应短信回应流回应身体阅读响应

在使用 MSXML 库和 XMLHttpRequest 对象之前,我做了这些,请参见 给你

Set objHTTP = CreateObject("MSXML2.ServerXMLHTTP")
URL = "http://www.somedomain.com"
objHTTP.Open "POST", URL, False
objHTTP.setRequestHeader "User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)"
objHTTP.send ""

或者,为了更好地控制 HTTP 请求,您可以使用 WinHttp.WinHttpRequest.5.1代替 MSXML2.ServerXMLHTTP

如果你需要它同时在 Mac 和 Windows 上工作,你可以使用 QueryTables:

With ActiveSheet.QueryTables.Add(Connection:="URL;http://carbon.brighterplanet.com/flights.txt", Destination:=Range("A2"))
.PostText = "origin_airport=MSN&destination_airport=ORD"
.RefreshStyle = xlOverwriteCells
.SaveData = True
.Refresh
End With

备注:

  • 关于输出... 我不知道是否有可能将结果返回到调用 VBA 函数的同一个单元。在上面的例子中,结果被写入 A2。
  • 关于输入... 如果希望在更改某些单元格时刷新结果,请确保这些单元格是 VBA 函数的参数。
  • 这在没有 VBA 的 Mac 2008的 Excel 上不起作用,而在 Mac 2011的 Excel 上恢复了 VBA。

有关更多细节,您可以看到我关于“ 使用来自 Excel 的 Web 服务”的完整摘要

除了 蜥蜴比尔的答案:

大多数后端解析原始文章数据。例如,在 PHP 中,将有一个数组 $_POST,其中将存储帖子数据中的各个变量。在这种情况下,你必须使用一个额外的头 "Content-type: application/x-www-form-urlencoded":

Set objHTTP = CreateObject("WinHttp.WinHttpRequest.5.1")
URL = "http://www.somedomain.com"
objHTTP.Open "POST", URL, 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.send "var1=value1&var2=value2&var3=value3"

否则,您必须读取变量 "$HTTP_RAW_POST_DATA"上的原始文章数据。

完成其他用户的响应:

为此,我创建了一个 “ WinHttp. WinHttpRequest. 5.1”对象。

使用 VBA 从 Excel 发送带有一些数据的帖子请求:

Dim LoginRequest As Object
Set LoginRequest = CreateObject("WinHttp.WinHttpRequest.5.1")
LoginRequest.Open "POST", "http://...", False
LoginRequest.setRequestHeader "Content-type", "application/x-www-form-urlencoded"
LoginRequest.send ("key1=value1&key2=value2")

使用 VBA 从 Excel 发送带令牌身份验证的 get 请求:

Dim TCRequestItem As Object
Set TCRequestItem = CreateObject("WinHttp.WinHttpRequest.5.1")
TCRequestItem.Open "GET", "http://...", False
TCRequestItem.setRequestHeader "Content-Type", "application/xml"
TCRequestItem.setRequestHeader "Accept", "application/xml"
TCRequestItem.setRequestHeader "Authorization", "Bearer " & token
TCRequestItem.send