VBA调用OAuth2.0伙伴API获取Access Token时提示‘Missing grant type’错误求助
问题排查与解决方案
我帮你找到了问题的核心原因,这是VBA代码里的一个请求头配置错误导致的,修正后就能正常获取Token了。
核心错误分析
你的CURL命令是完全正确的——它会自动把-d参数以application/x-www-form-urlencoded格式发送给服务器,但你的VBA代码里写错了关键的请求头:
objHTTP.SetRequestHeader "application", "x-www-form-urlencoded"
这里的头名称应该是Content-Type,而不是application!服务器无法识别这个错误的头字段,自然就解析不了你通过Send方法传递的grant_type参数,这就是为什么始终返回Missing grant type的原因。
另外,你额外设置的client_id和client_secret请求头是多余的,因为你已经通过Authorization: Basic ...完成了客户端身份认证,这部分可以移除,避免潜在的冲突。
修改后的可用VBA代码
Public Function API_MyArrow_Artikel(artikelBez) As String Dim objHTTP As Object Dim strHead As String, strClientId As String, strClientSecret As String Set objHTTP = CreateObject("WinHttp.WinHttpRequest.5.1") strClientId = "xxx" strClientSecret = "xxx" strUrl1 = "https://my.arrow.com/api/security/oauth/token" strHead = strClientId & ":" & strClientSecret objHTTP.Open "POST", strUrl1, False ' 修正Content-Type请求头,这是让服务器识别表单数据的关键 objHTTP.SetRequestHeader "Content-Type", "application/x-www-form-urlencoded" ' 仅保留Basic认证头即可,无需额外传递client_id和client_secret objHTTP.SetRequestHeader "Authorization", "Basic " + Base64Encode(strHead) objHTTP.SetTimeouts 10000, 10000, 10000, 10000 objHTTP.SetRequestHeader "User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)" ' 正确发送表单格式的grant_type参数 objHTTP.Send "grant_type=client_credentials" API_MyArrow_Artikel = objHTTP.responseText End Function
额外注意事项
- 请确认你的
Base64Encode函数能正确对client_id:client_secret字符串进行Base64编码,这是Basic认证生效的前提; - OAuth2的
client_credentials模式明确要求grant_type参数必须放在请求体(表单数据)中,放在请求头里是不符合规范的; - 测试时可以先打印
Base64Encode(strHead)的结果,和CURL里-u参数自动生成的Base64串对比,确保编码正确。
内容的提问来源于stack exchange,提问作者Thorsten C.
相关产品推荐
相关产品推荐

