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

Mat*_*och 129 excel post vba http serverxmlhttp

从Excel电子表格执行HTTP POST需要哪些VBA代码?

Bil*_*ard 140

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("")
Run Code Online (Sandbox Code Playgroud)

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

  • 为了更好地控制HTTP请求,您可以使用"WinHttp.WinHttpRequest.5.1"而不是"MSXML2.ServerXMLHTTP" (9认同)
  • 如果不使用Sub的返回值,请不要在参数周围使用括号:VBA语法不允许在Sub的参数周围使用括号(尽管函数需要它们),因此这些括号实际上是用于阐明运算符优先级的算术括号.除了误导和不清楚之外,如果参数是一个对象,这最终会导致运行时错误.虽然没有明确要求,但通常你会想要使用HTTP响应,你可以提到它可以通过`objHTTP.responseText`检索. (6认同)
  • 值得注意的是,您也可以通过将"POST"更改为"PUT"来使用它来发出HTTP PUT.PUT的内容进入.send()方法.您还需要按照User-Agent示例中使用的语法完成您需要设置的任何其他标头. (5认同)
  • @Leviathan parens实际上做的不止于此:它们使VBA运行时*将表达式计算为值*,并且*将其传递给方法ByVal***,无论该方法的签名是否显示为"ByRef".这就是为什么将它们与没有默认成员的类型的对象变量一起使用会导致运行时错误; 并且在*具有默认成员的对象上使用它们,传递默认成员的值而不是实际对象. (4认同)
  • json 有效负载怎么样...我们如何将其传递到 send 中? (2认同)

Sea*_*ere 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
Run Code Online (Sandbox Code Playgroud)

笔记:

  • 关于输出......我不知道是否可以将结果返回到调用VBA函数的同一个单元格.在上面的示例中,结果写入A2.
  • 关于输入...如果要在更改某些单元格时刷新结果,请确保这些单元格是VBA函数的参数.
  • 这不适用于没有VBA的Excel for Mac 2008.Excel for Mac 2011得到了VBA.

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

  • +1:我只需要在Windows上使用它,但跨平台解决方案可能会让其他人受益. (3认同)
  • 是否可以将结果输出到变量而不是 Range ?需要做一些Json解析。 (2认同)

小智 40

除了比尔蜥蜴的anwser :

大多数后端解析原始发布数据.例如,在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")
Run Code Online (Sandbox Code Playgroud)

否则,您必须读取变量"$ HTTP_RAW_POST_DATA"上的原始发布数据.


dav*_*d.q 10

要完成其他用户的响应:

为此,我创建了一个“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")
Run Code Online (Sandbox Code Playgroud)

使用 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
Run Code Online (Sandbox Code Playgroud)


Mar*_*iek 6

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

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

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

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

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

  1. 调用open方法连接到远程服务器
  2. 呼叫发送以发送请求.
  3. 通过responseXML,responseText,responseStreamresponseBody读取响应