【发布时间】:2010-09-14 14:10:36
【问题描述】:
从 Excel 电子表格执行 HTTP POST 需要什么 VBA 代码?
【问题讨论】:
标签: excel vba http post serverxmlhttp
从 Excel 电子表格执行 HTTP POST 需要什么 VBA 代码?
【问题讨论】:
标签: excel vba http post serverxmlhttp
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。
【讨论】:
objHTTP.responseText 检索。
ByRef。这就是为什么将它们与没有默认成员的类型的对象变量一起使用会导致运行时错误;并在确实具有默认成员的对象上使用它们,传递该默认成员的值而不是实际对象。
如果您需要它同时在 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
注意事项:
更多细节可以看我关于“using web services from Excel”的完整总结。
【讨论】:
除了Bill the Lizard的回答:
大多数后端解析原始帖子数据。例如,在 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
【讨论】:
TCRequestItem Object里面,你可以在TCRequestItem.send之后读成:TCRequestItem.ResponseText
您可以通过添加对MSXML 的引用在VBA 项目中使用ServerXMLHTTP。
- 打开 VBA 编辑器(通常通过编辑宏)
- 转到可用参考列表
- 检查 Microsoft XML
- 点击确定。
(来自Referencing MSXML within VBA Projects)
ServerXMLHTTP MSDN documentation 包含有关 ServerXMLHTTP 的所有属性和方法的完整详细信息。
简而言之,它的工作原理基本上是这样的:
- 调用open方法连接远程服务器
- 致电send发送请求。
- 通过responseXML、responseText、responseStream 或responseBody 阅读回复
【讨论】:
我在使用 MSXML 库然后使用 XMLHttpRequest 对象之前这样做了,请参阅here。
【讨论】: