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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 07:31:06