我正在使用 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 会话中发送这两个查询有什么帮助吗?
感谢 @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