You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Excel VBA的WinHTTPRequest发送form-data POST请求完成FastAPI OAuth2认证

使用WinHttpRequest在VBA中发送form-data格式的OAuth2认证POST请求

没问题,我来帮你把现有的GET请求函数改成符合FastAPI OAuth2要求的form-data POST请求。首先,你得清楚multipart/form-data的结构——它需要一个自定义的边界字符串来分隔表单字段,同时要设置正确的请求头。下面是修改后的完整函数,关键步骤我都加了注释:

Public Function postOAuthFormData(tokenUrl As String, username As String, password As String) As String
    Dim req As WinHttpRequest
    Dim boundary As String
    Dim formData As String
    Dim resp As String
    Dim errorstring As String
    
    Set req = New WinHttpRequest
    
    ' 1. 定义一个唯一的边界字符串(可以自定义,只要不包含在表单内容里就行)
    boundary = "----WinHttpFormBoundary7MA4YWxkTrZu0gW"
    
    ' 2. 设置请求头:指定Content-Type为multipart/form-data,带上边界
    req.SetRequestHeader "Content-Type", "multipart/form-data; boundary=" & boundary
    
    ' 3. 构造form-data请求体
    formData = "--" & boundary & vbCrLf
    formData = formData & "Content-Disposition: form-data; name=""username""" & vbCrLf & vbCrLf
    formData = formData & username & vbCrLf
    formData = formData & "--" & boundary & vbCrLf
    formData = formData & "Content-Disposition: form-data; name=""password""" & vbCrLf & vbCrLf
    formData = formData & password & vbCrLf
    formData = formData & "--" & boundary & "--" & vbCrLf  ' 结束边界要加两个连字符
    
    ' 4. 打开POST请求,指向你的OAuth2 token端点
    req.Open "POST", tokenUrl, False  ' False表示同步请求
    
    On Error GoTo errhand:
    ' 5. 发送构造好的form-data请求体
    req.Send formData
    
    resp = req.ResponseText
    ' 处理接口返回的内部错误
    If resp = "Internal Server Error" Then
        resp = "{'error': 'Internal server error'}"
    End If
    
    postOAuthFormData = resp
    Exit Function
    
errhand:
    Select Case Err.Number
        Case -2147012894 ' 请求超时
            postOAuthFormData = "{'error': 'Request timeout'}"
        Case -2147012891 ' 无效URL
            postOAuthFormData = "{'error': 'Bad url'}"
        Case -2147012867 ' 无法建立连接
            postOAuthFormData = "{'error': 'Cannot establish connection'}"
        Case Else ' 其他错误
            errorstring = "Errornumber: " & Err.Number & vbNewLine & "Errordescription: " & Error(Err.Number)
            postOAuthFormData = "{'error': '" & Replace(errorstring, "'", "\'") & "'}"  ' 转义单引号避免JSON格式错误
    End Select
End Function

关键修改点说明:

  • 请求方法与端点:把原来的GET改成POST,并传入你的OAuth2 token接口URL(比如http://your-fastapi-server/token)
  • Content-Type头:必须明确指定multipart/form-data并带上边界字符串,FastAPI才能正确解析表单数据
  • form-data结构:每个字段都需要用边界分隔,同时要包含Content-Disposition头来指定字段名(这里就是username和password)
  • 错误处理优化:给错误信息里的单引号加了转义,避免返回的JSON格式出错
  • 同步请求:这里用了False设置同步请求,如果你需要异步可以改成True,但需要额外处理回调

使用示例:

Sub TestOAuthPost()
    Dim tokenResponse As String
    tokenResponse = postOAuthFormData("http://your-fastapi-server/token", "your-username", "your-password")
    Debug.Print tokenResponse  ' 在立即窗口查看返回的token或错误信息
End Sub

内容的提问来源于stack exchange,提问作者Thomas Browne

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 18:02:44