代码之家  ›  专栏  ›  技术社区  ›  Hyper10n

从T-SQL查询内部管理HTTP会话

  •  0
  • Hyper10n  · 技术社区  · 1 年前

    我正在使用T-SQL调用从API获取数据。

    让我首先说:这并不理想。 代码库不能更改,我留在数据库端,在我们的内部网络上“使其工作”(不面向公众)。

    我可以使用下面的脚本从API得到“登录成功”的回复。 问题是,此API不使用令牌进行身份验证。因此,我无法在第二个查询中将令牌作为头返回。

    DECLARE @AUTH_URL NVARCHAR(MAX) = '_api_url_login_';
    
    Declare @Object as Int;
    Declare @Status as Int;
    
    Declare @ResponseText as Varchar(8000);
    
    Exec sp_OACreate 'MSXML2.ServerXMLHTTP', @Object OUT;
    Exec sp_OAMethod @Object, 'open', NULL, 'post', @AUTH_URL, 'false'
    Exec sp_OAMethod @Object, 'setRequestHeader', NULL, 'Content-Type', 'application/x-www-form-urlencoded'
    Exec sp_OAMethod @Object, 'send', NULL, '{"username":"___", "password":"___"}'
    Exec sp_OAGetProperty @Object, 'status', @Status OUT
    Exec sp_OAMethod @Object, 'responseText', @ResponseText OUTPUT
    

    登录网站并直接从Chrome和Postman调用API可以工作,但不能从SQL Server工作。我认为这是因为SQL Server不维护HTTP会话状态。

    GET请求代码如下,我收到了来自API的一般错误(无法发布错误)。

    以下是我的GET请求代码:

    DECLARE @JOB_URL NVARCHAR(MAX) = '_api_url_';
    
    Declare @Object2 as Int;
    Declare @Status2 as Int;
    
    Declare @ResponseText2 as Varchar(8000);
    
    Exec sp_OACreate 'MSXML2.XMLHTTP', @Object2 OUT;
    Exec sp_OAMethod @Object2, 'open', NULL, 'get', @JOB_URL, 'False'
    Exec sp_OAMethod @Object2, 'send'
    Exec sp_OAGetProperty @Object2, 'status', @Status2 OUT
    Exec sp_OAMethod @Object2, 'responseText', @ResponseText2 OUTPUT
    
    select @ResponseText2
    select @Status2
    

    使用T-SQL在单个HTTP会话中发送这两个查询有什么帮助吗?

    0 回复  |  直到 1 年前
        1
  •  -1
  •   Hyper10n    1 年前

    感谢@siggemannen的建议 将原始OA对象重新用于进一步的请求 。请提供答案,我会接受

    以下是有效的代码。。。

    --Login
    -------------------------------------------------------------------
    DECLARE @AUTH_URL NVARCHAR(MAX) = '_api_url_login_';
    
    Declare @Object as Int;
    Declare @Status as Int;
    
    Declare @Header as Varchar(8000);
    Declare @Cookie as Varchar(8000);
    Declare @ResponseText as varchar(8000);
    
    Exec sp_OACreate 'MSXML2.ServerXMLHTTP', @Object OUT;
    Exec sp_OAMethod @Object, 'open', NULL, 'post', @AUTH_URL, 'false'
    Exec sp_OAMethod @Object, 'setRequestHeader', NULL, 'Content-Type', 'application/x-www-form-urlencoded'
    Exec sp_OAMethod @Object, 'send', NULL, '{"username":"___", "password":"___"}'
    
    --Grab Data
    ------------------------------------------
    DECLARE @JOB_URL NVARCHAR(MAX) = '_api_url_';
    
    Declare @Object2 as Int;
    Declare @Status2 as Int;
    
    Declare @ResponseText2 as Varchar(8000);
    
    Exec sp_OAMethod @Object, 'open', NULL, 'get', @JOB_URL, 'False'
    Exec sp_OAMethod @Object, 'send'
    Exec sp_OAGetProperty @Object, 'status', @Status2 OUT
    Exec sp_OAMethod @Object, 'responseText', @ResponseText2 OUTPUT
    
    select @ResponseText2 response
    select @Status2 "status"
    
    EXEC sp_OADestroy @Object