在查询REST API的SQL中设置自定义请求标头,该API期望会话在标头中传递

在查询REST API的SQL中设置自定义请求标头,该API期望会话在标头中传递,sql,json,sql-server,api,http,Sql,Json,Sql Server,Api,Http,下面是一个奇妙的答案: 我能够从HTTP请求中获取响应主体,并将其发送到RESTAPI服务器,该服务器以JSON格式响应。 当API端点不需要会话ID时,这种方法非常有效 但是,我想查询的端点需要会话ID(我已经测试了一个永久ID,没有任何身份验证问题) 在分析Wireshark中的HTTP请求时,我可以看到数据包中没有提到我的头。但是当我通过web浏览器与API交互时,我可以看到我的会话Id被传递 以下是我的SQL: Declare @Object as Int; Declare @Respo

下面是一个奇妙的答案:

我能够从HTTP请求中获取响应主体,并将其发送到RESTAPI服务器,该服务器以JSON格式响应。 当API端点不需要会话ID时,这种方法非常有效

但是,我想查询的端点需要会话ID(我已经测试了一个永久ID,没有任何身份验证问题)

在分析Wireshark中的HTTP请求时,我可以看到数据包中没有提到我的头。但是当我通过web浏览器与API交互时,我可以看到我的会话Id被传递

以下是我的SQL:

Declare @Object as Int;
Declare @Response table (txt nvarchar(max));

Exec sp_OACreate 'MSXML2.serverXMLHTTP', @Object OUT;
Exec sp_OAMethod @Object, 'open', NULL, 'GET',
             'http://someip/Rest/EndPoint'
Exec sp_OAMethod @Object, 'setRequestHeader',null,'Session-Id','123456789'
Exec sp_OAMethod @Object, 'send'

Insert Into @Response (txt)
Exec sp_OAMethod @Object, 'responseText'

Exec sp_OADestroy @Object   

Select txt From @Response
我可以在Javascipt(见下文)中轻松实现这一点;但是,在SQL中需要它来将响应解析到SQL表中,而无需使用像NodeJS这样的中间人并将响应发送到SQL server

var xhr = new XMLHttpRequest();
xhr.open("GET", url, true);
xhr.setRequestHeader("Session-Id", "123456789");
任何/所有帮助都将不胜感激


谢谢

现在问题已经解决了;它不起作用的原因有两个:

  • 需要从与运行查询的服务器相同的源生成会话ID(例如,web前端生成了一个会话ID,该会话ID链接到从中生成的机器ID,运行SQL的服务器必须是生成会话ID的服务器)
  • 我从中运行查询的服务器具有过期的SSL证书,需要更新该证书
  • 两者都有一定的优势,但也许这个答案会帮助某些人,或者至少排除一些原因,谁知道呢