【问题标题】:How to send a form-data POST request with VBA in Excel using WinHTTPRequest如何使用 WinHTTPRequest 在 Excel 中使用 VBA 发送表单数据 POST 请求
【发布时间】:2020-09-05 14:14:15
【问题描述】:

我正在使用 FastAPI 构建一个 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

【问题讨论】:

  • VBA POST json to API 有帮助吗?如果使用基本身份验证,身份验证凭据通常通过SetRequestHeader "Authorization", "basic " + Base64Encode(PasswordnUsername) 发送。
  • 否,因为您的示例是内容类型 JSON,我需要表单数据。
  • 我认为没有太大区别。看看这里XmlHttpRequest – Http requests in Excel VBA这是发送表单数据。
  • 我仍然看不出有任何理由坚持使用 WinHTTPRequest。有没有?但请在下面查看我的答案。实际上,无论您最终使用WinHTTPRequestMSXML2.ServerXMLHTTP.6.0 还是MSXML2.serverXMLHTTP,结构总是非常相似。

标签: excel vba winhttp fastapi winhttprequest


【解决方案1】:

您需要打开一个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)

查看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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-04
    • 2011-10-03
    • 1970-01-01
    • 2010-09-14
    • 1970-01-01
    • 2020-08-31
    • 2023-01-08
    • 1970-01-01
    相关资源
    最近更新 更多