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


Answers:


147
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


9
为了更好地控制HTTP请求,您可以使用“ WinHttp.WinHttpRequest.5.1”代替“ MSXML2.ServerXMLHTTP”
Matthew Murdoch

5
值得注意的是,您也可以通过将“ POST”更改为“ PUT”来使用它来发出HTTP PUT。PUT的内容在.send()方法中。您还可以按照User-Agent示例中使用的语法来完成需要设置的任何其他标头。
radicand

7
如果您不使用Sub的返回值,请不要在参数周围使用括号:VBA语法不允许在Sub的参数周围使用括号(不过,对于Function而言,它们是必需的),因此这些括号实际上是用于阐明运算符优先级的算术括号。如果参数为对象,则除了会引起误解和不清楚之外,最终还会导致运行时错误。尽管没有明确要求,但通常您还是希望使用HTTP响应,您可以提到该响应可以通过检索objHTTP.responseText
Leviathan

4
@Leviathan的实际作用还不止这些:它们使VBA运行时将表达式作为值进行评估,并将其传递给ByVal方法, 不管该方法的签名是否有效ByRef。这就是为什么将它们与没有默认成员类型的对象变量一起使用会导致运行时错误的原因。并在具有默认成员的对象上使用它们,传递该默认成员的值而不是实际对象。
Mathieu Guindon

1
一百万次谢谢。我不知道为什么,因为在任何其他示例中都没有看到它,但是“ User-Agent”标头对我来说至关重要,因为否则该正文不会在我的请求中发送。
redOctober13

51

如果需要它在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的Excel for Mac 2008。Excel for Mac 2011恢复了VBA。

有关更多详细信息,您可以查看我的有关“ 使用Excel中的Web服务 ”的完整摘要。


3
+1:我只在Windows上需要它,但是跨平台的解决方案可能会使其他人受益。
马修·默多克

我认为您实际上无法访问html代码,只能在呈现的网页上获取信息(而不是实际的html代码)
user1493046 2013年

1
+1用于跨平台解决方案,+ 1(如果可以的话)用于包含要点链接和全部内容的完整摘要。谢谢!!
空袭

我必须同时支持Windows和Mac,并且此解决方案正确无误!请注意,当您指定PostText时,URL应处理POST请求,否则应处理GET请求。
13年

1
是否可以将结果输出到变量而不是范围?需要做一些Json解析。
Stanislasdrg恢复莫妮卡

42

除了比尔的蜥蜴 ws :

大多数后端都会解析原始的发布数据。例如,在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"


1
我正在尝试发布此请求(带有大括号)并获得编译错误...您能否提供帮助:“ {” request“:{” carName“:” Honda“,” model“:” 1A5“}}”“
提琴

6

您可以ServerXMLHTTP在VBA项目中使用对的引用MSXML

  1. 打开VBA编辑器(通常通过编辑宏)
  2. 转到可用参考列表
  3. 检查Microsoft XML
  4. 单击确定。

(来自在VBA项目中引用MSXML

ServerXMLHTTP的MSDN文档有大约所有属性和ServerXMLHTTP的方法的全部细节。

简而言之,它基本上是这样的:

  1. 调用打开方法以连接到远程服务器
  2. 致电发送以发送请求。
  3. 通过responseXMLresponseTextresponseStreamresponseBody读取响应

1
该链接使用的是jscript,而不是VBA
John Henckel,2016年

1
谢谢@JohnHenckel。我进行了一些更改以使该答案保持最新。
马克·比耶克

3

要完成其他用户的响应:

为此,我创建了一个“ 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

大卫,您发送请求后,如何阅读回复?
ps0604

响应位于里面TCRequestItem Object,您可以像TCRequestItem.ResponseText这样阅读:做完之后TCRequestItem.send
David Q

0

我在使用MSXML库然后使用XMLHttpRequest对象之前进行了此操作,请参见此处


1
文件未找到。
SuShuang
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.