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

问题描述 投票:0回答:1

我正在使用必须从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
excel vba winhttp fastapi winhttprequest
1个回答
2
投票

代替打开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)
© www.soinside.com 2019 - 2024. All rights reserved.