如何使用WinHTTPRequest在Excel中使用VBA发送表单数据POST请求



我正在使用FastAPI构建一个API,该API必须可以从Excel VBA访问。FastAPI 的 OAuth2 身份验证机制要求我发送"表单数据"POST 请求,但我不知道如何使用 VBA 中的 WinHTTPRequest 执行此操作。

我已经有一个从 API 获取纯 JSON 的函数,但这是一个 GET 函数,我不确定在正文中在哪里指定"表单数据"部分,也不确定在哪里放置用户名和密码键值对。

这是一个处理一些错误的简单VBA GET。我将如何修改它以使用用户名和密码字段执行表单数据 POST?

Public Function getreq(url As String)
Dim req As WinHttpRequest
Dim JsonString As String
Dim jp As Object
Dim resp As String
Dim errorstring As String
Set req = New WinHttpRequest
' req.SetRequestHeaderxxx ?
' this is where auth will go via POST form-data username and password?
req.Open "GET", url
On Error GoTo errhand:
req.Send
resp = req.ResponseText
If resp = "Internal Server Error" Then
resp = "{'error': 'Internal server error'}"
End If
getreq = resp
Exit Function
errhand:
Select Case Err.Number
Case -2147012894 'Code for Timeout
getreq = "{'error': 'Request timeout'}"
Case -2147012891 'Code for Invalid URL
getreq = "{'error': 'Bad url'}"
Case -2147012867 'Code for Invalid URL
getreq = "{'error': 'Cannot establish connection'}"
Case Else 'Add more Errorcodes here if wanted
errorstring = "Errornumber: " & Err.Number & vbNewLine & "Errordescription: " & Error(Err.Number)
getreq = "{'error': '" & errorstring & "'}"
End Select
End Function

您需要打开一个POST,而不是打开 GET 请求req.Open "GET", url

req.Open "POST", url, False

然后,您可以使用setRequestHeader来设置要发送的内容类型以及接受的返回内容。

req.setRequestHeader "Content-Type", "multipart/form-data"
req.setRequestHeader "Accept", "application/xml"

对于授权,您还需要创建一个请求标头。这取决于您的 API 使用的内容。

req.setRequestHeader "Authorization:", "Bearer " & EncodeBase64("Your-access-token")

最后,您发送您的请求

req.send (YourData)

看看这个答案,它显示了multipart/form-data的数据结构是如何生成的。


如果WinHTTPRequest不起作用,我建议尝试以下操作

Set objHttp = CreateObject("MSXML2.ServerXMLHTTP.6.0")
URL = "https:///commercial/payments-processing/v1/test/token"
objHttp.Open "POST", URL, False
objHttp.setRequestHeader "Content-Type", "multipart/form-data"
objHttp.setRequestHeader "Accept", "application/xml"
objHttp.setRequestHeader "Authorization:", "Bearer [Access Token]"
objHttp.send (strPaylodValue)
strResponseStatus = objHttp.Status
strResponseText = objHttp.ResponseText
strResponseText = CStr(strResponseText)

相关内容

  • 没有找到相关文章

最新更新