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

VBA调用带API Key认证的REST API报‘API key缺失’求助

问题:VBA调用REST API时提示“API key is missing”错误

背景

  • 需调用的REST API提供了URL、API Key(token)、API Key标识为“apikey”,以及用户名
  • Postman中通过API Key认证成功调用:在Authorization选项卡选择API Key类型,输入apikey作为键,对应token作为值,无需使用用户名
  • 现有VBA自动化架构,需直接用VBA实现API调用,不集成Postman

尝试的VBA代码及问题

第一段代码(Basic Auth方式)

Public Sub GetResults()
    Dim data As String, json As Object '<  VBE > Tools > References > Microsoft Scripting Runtime
    Dim strUrl As String
    strUrl = "[Provided URL]"

    Set hReq = CreateObject("WinHttp.WinHttpRequest.5.1")
    With hReq
        .Open "GET", strUrl, False
        .setRequestHeader "Authorization", "Basic " + _
            EncodeBase64("[Username]" + ":" + "[Token]")
        .send
    End With

    Dim response As String
    response = hReq.responseText
    
    MsgBox response
End Sub

Function EncodeBase64(text As String) As String
    Dim arrData() As Byte
    arrData = StrConv(text, vbFromUnicode)

    Dim objXML As MSXML2.DOMDocument60
    Dim objNode As MSXML2.IXMLDOMElement

    Set objXML = New MSXML2.DOMDocument60
    Set objNode = objXML.createElement("b64")

    objNode.DataType = "bin.base64"
    objNode.nodeTypedValue = arrData
    EncodeBase64 = Application.Clean(objNode.text)

    Set objNode = Nothing
    Set objXML = Nothing
End Function

尝试将[Username]替换为实际用户名或apikey,均收到API key is missing错误,说明请求已到达服务器,但认证头设置不符合要求。

第二段代码(Bearer Auth方式)

Sub GetResultData()
    Dim hReq As Object, json As Dictionary
    Dim sht As Worksheet

    Set sht = Sheet1

    Dim strUrl As String
    strUrl = "[Provided URL]"
    Set hReq = CreateObject("MSXML2.XMLHTTP")
    With hReq
        .Open "GET", strUrl, False
        .setRequestHeader "Authorization", "Bearer [Username]:[Token]"
        .send
    End With

    Dim response As String
    response = hReq.responseText
    
    MsgBox response
End Sub

同样收到API key is missing错误,不确定是否需要Base64编码。

问题根源及解决方案

核心错误是误用了认证方式:Postman中使用的是API Key认证,而非Basic Auth或Bearer Auth。这种认证方式的本质是直接在请求头中添加一个名为apikey的字段,值为你的token,不需要放在Authorization头里。

修正后的VBA代码示例(WinHttp版本)

Public Sub GetResults_Correct()
    Dim strUrl As String
    strUrl = "[Provided URL]"
    Dim apiToken As String
    apiToken = "[Your Token]" ' 替换为实际token

    Set hReq = CreateObject("WinHttp.WinHttpRequest.5.1")
    With hReq
        .Open "GET", strUrl, False
        .setRequestHeader "apikey", apiToken ' 直接添加apikey请求头
        .send
    End With

    Dim response As String
    response = hReq.responseText
    
    MsgBox response
End Sub

特殊情况处理

如果API要求将API Key放在Authorization头中(比如格式为apikey <token>),则修改请求头为:

.setRequestHeader "Authorization", "apikey " & apiToken

验证建议:在Postman中查看请求的Raw Headers,确认实际发送的请求头格式,然后在VBA中完全复刻即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 15:50:30