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

问题描述 投票:0回答: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 会话中发送这两个查询有什么帮助吗?

sql-server rest t-sql
1个回答
0
投票

感谢 @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
© www.soinside.com 2019 - 2024. All rights reserved.