我正在使用必须从Excel VBA访问的FastAPI构建API。 FastAPI的OAuth2身份验证机制要求我发送“表单数据” POST请求,但是我不知道如何在VBA中使用WinHTTPRequest来执行此操作。
我已经有一个可以从API中获取纯JSON的函数,但这是一个GET函数,我不确定在哪里在正文中指定“ form-data”部分,也不确定在哪里放置用户名和密码密钥-值对。
这里是处理一些错误的简单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
代替打开GET请求req.Open "GET", url
,您需要打开POST
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)
查看this answer,它显示了如何生成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)