使用sp_OACreate调用接口提示未传token,Postman可正常请求求排查
问题分析与修复方案
你的代码核心问题出在Authorization请求头设置后的错误处理逻辑,导致后续的请求头设置和发送操作失效,最终接口没有收到Token。
具体问题点
在设置Authorization头后,你将INT类型的@ret变量赋值为字符串:
if @ret <> 0 begin set @ret = 'sp_OAMethod setRequestHeader failed' end
这会导致@ret的类型从INT变为NVARCHAR,后续调用sp_OAMethod设置Content-Type头、发送请求时,@ret作为返回值变量类型不匹配,直接导致这些操作执行失败。最终请求没有携带Authorization头,因此接口提示未传递Token。
修复后的代码
declare @method varchar(5) = 'GET', @url varchar(8000) = 'http://srvweb1c/AccountingCorp/hs/api_accounting_corp/agent_info/', @token NVARCHAR(2000) = '567f9bbc-fc08-4dd1-b64b-e4289b221383', @params NVARCHAR(2000) = '' DECLARE @authHeader NVARCHAR(2000); DECLARE @contentType NVARCHAR(64); DECLARE @postData NVARCHAR(2000); DECLARE @responseText NVARCHAR(2000); DECLARE @responseXML NVARCHAR(2000); DECLARE @ret INT; DECLARE @status NVARCHAR(32); DECLARE @statusText NVARCHAR(32); DECLARE @internalToken INT; -- 新增错误信息变量,避免破坏@ret的类型 DECLARE @errorMsg NVARCHAR(2000); SET @authHeader= 'Bearer ' + @token; SET @contentType = 'application/json'; -- Open the connection. EXEC @ret = sp_OACreate 'MSXML2.ServerXMLHTTP', @internalToken OUT; IF @ret <> 0 BEGIN SET @errorMsg = 'sp_OACreate failed, error code: ' + CAST(@ret AS NVARCHAR); GOTO Cleanup; END -- Send the request. EXEC @ret = sp_OAMethod @internalToken, 'open', NULL, @method, @url, 'false'; IF @ret <> 0 BEGIN SET @errorMsg = 'sp_OAMethod open failed, error code: ' + CAST(@ret AS NVARCHAR); GOTO Cleanup; END EXEC @ret = sp_OAMethod @internalToken, 'setRequestHeader', NULL, 'Authorization', @authHeader; IF @ret <> 0 BEGIN SET @errorMsg = 'sp_OAMethod setRequestHeader(Authorization) failed, error code: ' + CAST(@ret AS NVARCHAR); GOTO Cleanup; END EXEC @ret = sp_OAMethod @internalToken, 'setRequestHeader', NULL, 'Content-type', @contentType; IF @ret <> 0 BEGIN SET @errorMsg = 'sp_OAMethod setRequestHeader(Content-type) failed, error code: ' + CAST(@ret AS NVARCHAR); GOTO Cleanup; END EXEC @ret = sp_OAMethod @internalToken, 'send', NULL, @params; IF @ret <> 0 BEGIN SET @errorMsg = 'sp_OAMethod send failed, error code: ' + CAST(@ret AS NVARCHAR); GOTO Cleanup; END -- Handle the response. EXEC @ret = sp_OAGetProperty @internalToken, 'status', @status OUT; EXEC @ret = sp_OAGetProperty @internalToken, 'statusText', @statusText OUT; EXEC @ret = sp_OAGetProperty @internalToken, 'responseText', @responseText OUT; -- Show the response. PRINT 'Status: ' + @status + ' (' + @statusText + ')'; PRINT 'Response text: ' + @responseText; Cleanup: -- 输出错误信息(如果有) IF @errorMsg IS NOT NULL PRINT 'Error: ' + @errorMsg; -- Close the connection. IF @internalToken IS NOT NULL EXEC @ret = sp_OADestroy @internalToken;
额外优化建议
- GET请求无需Content-Type头:GET请求通常不需要设置Content-Type,因为没有请求体,你可以移除这行代码,减少不必要的请求头。
- 添加完整的错误处理:每个OLE操作都添加错误检查,并用单独的变量存储错误信息,避免破坏返回值变量的类型。
- 使用
MSXML2.XMLHTTP.6.0替代旧版本:推荐使用更高版本的组件,兼容性和稳定性更好,将sp_OACreate的参数改为'MSXML2.XMLHTTP.6.0'。
内容的提问来源于stack exchange,提问作者MaratKasumov
相关产品推荐
相关产品推荐

