2008-10-01 1320 views

回答

116
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("") 

另外,超过您可以代替MSXML2.ServerXMLHTTP使用WinHttp.WinHttpRequest.5.1 HTTP请求更大的控制权。

+8

为了更好地控制HTTP请求,您可以使用“WinHttp.WinHttpRequest.5.1”而不是“MSXML2.ServerXMLHTTP” – 2008-10-03 10:23:43

+5

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

4

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

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

(从Referencing MSXML within VBA Projects

ServerXMLHTTP MSDN documentation具有所有属性和ServerXMLHTTP的方法的全部细节。

总之,虽然,它的工作原理基本上是这样的:

  1. 呼叫open方法连接到远程服务器
  2. 呼叫send发送请求。
  3. 读通过responseXMLresponseTextresponseStreamresponseBody
+0

该链接使用jscript,而不是VBA – 2016-08-19 04:16:24

+1

谢谢@JohnHenckel。我做出了一些更改,以使这个答案保持最新。 – 2016-08-19 11:39:52

49

如果你需要它同时支持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函数的参数。
  • 这不适用于Mac 2008的Excel,它不具有VBA。 Excel for Mac 2011让VBA回归。

有关更多详细信息,请参阅“using web services from Excel”的完整摘要。

31

除了对Bill the Lizard的anwser:

大多数后端的解析原始post数据。例如,在PHP中,您将有一个数组$ _POST,其中存储发布数据中的各个变量。在这种情况下,你必须使用一个额外的头“内容类型:应用程序/ x-WWW的形式,进行了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”原始post数据。