从 SQL Server 向 REST API 发送请求并检查返回的 http 代码

Posted

技术标签:

【中文标题】从 SQL Server 向 REST API 发送请求并检查返回的 http 代码【英文标题】:Send requests to rest API from SQL Server and check http code returned 【发布时间】:2019-12-09 06:22:34 【问题描述】:

我正在尝试将 json 数据发送到 rest API,最好是从 SQL Server 2016。我遇到了以下代码(来自 https://gist.github.com/theorigin/fa3c58406ff7b4565ca2),它使用 sp_OAMethod 并使用 webhook.site 对其进行了测试,所以我知道发送,但我看不到来自 SQL 的 http 响应代码,这是我需要查看的内容...如果提交有问题,相关 API 会发送 400 响应以及错误消息,如果提交有问题,则发送 200一切都是正确的。

SQL 代码在所有场景下都返回 NULL 列。目前,我编写了一个 php 应用程序,它为我完成了所有这些工作,只是它不是自动化的。该应用程序通过 csv 文件运行,并一次将 json 一行发送到端点。在我将其更改为查看查询结果而不是 csv 文件之前,以及在我开始考虑将其添加到 cron 作业(或者可能是 Windows 中的计划任务?)之前,我一直想知道我想要实现的目标是否可行使用 SQL Server,这是存储我所有数据的地方。不过,这可能是一个圆形钉子插入一个方孔,如果是这样,那么我会打折这种方法。

DECLARE @Object AS INT;
DECLARE @ResponseText AS VARCHAR(8000);
DECLARE @Body AS VARCHAR(8000) = 
'
    "name": "John",
    "age": 30,
'  

EXEC sp_OACreate 'MSXML2.XMLHTTP', @Object OUT;
EXEC sp_OAMethod @Object, 'open', NULL, 'post','https://webhook.site/1234', 'false'

EXEC sp_OAMethod @Object, 'setRequestHeader', null, 'Content-Type', 'application/json'
EXEC sp_OAMethod @Object, 'send', null, @body

EXEC sp_OAMethod @Object, 'responseText', @ResponseText OUTPUT
SELECT @ResponseText

EXEC sp_OADestroy @Object

理想情况下,我会看到“200”或“400”作为每个请求的响应,并且我可以在存储过程运行后解析它们。

非常欢迎任何帮助或建议。 谢谢

【问题讨论】:

Set option 9 in SQL Server stored procedure using WinHttp.WinHttpRequest.5.1 for TLS 1.2的可能重复 所以换句话说 sp_OA 程序是一个坏主意,我应该看看替代方案。 SQL CLR? 基本上,是的。这里有一个相关示例:github.com/microsoft/sql-server-samples/tree/master/samples/… 【参考方案1】:

我认为原因是因为你做了SELECT @ResponseText,然后你对SELECT返回的任何东西都不做任何事情,最后你销毁了这个对象。

尝试将您在@ResponseText 中保存的响应分配给另一个变量。在下面的示例中,我正在登录一个 rest API,然后我将响应分配给另一个变量:

EXEC sp_OACREATE 'MSXML2.ServerXMLHttp', @Object OUT;
EXEC sp_OAMethod @Object, 'Open', NULL, 'POST', 'https://url.net/api/LoginUser', 'false'
EXEC sp_OAMethod @Object, 'SETRequestHeader', null, 'Content-Type', 'application/json'

DECLARE @len int
SET @len = len(@body)

EXEC sp_OAMethod @Object, 'SETRequestHeader', null, 'Ocp-Apim-Subscription-Key','4f82f9d067914287979884f920d86ffb'
EXEC sp_OAMethod @Object, 'SETRequestHeader', null, 'Ocp-Apim-Trace:true'
EXEC sp_OAMethod @Object, 'SETRequestHeader', null, 'Content-Length', @len
EXEC sp_OAMethod @Object, 'SETRequestBody', null, 'Body', @body
EXEC sp_OAMethod @Object, 'Send', null, @body
EXEC sp_OAMethod @Object, 'ResponseText', @ResponseText OUTPUT

SELECT @Token=@ResponseText

EXEC sp_OADestroy @Object

SET @Token='Bearer '+ REPLACE(@Token, '"', '')

PRINT @Token

【讨论】:

【参考方案2】:

尝试在临时表中使用 SELECT 来评估结果。

DECLARE @tableResponseText TABLE (
    [ResponseText] VARCHAR(MAX)
    )

您的设置/发送语句

收集响应数据

EXEC @RC = sp_OAGetProperty @Object, 'status', @HttpResponseCode OUT
INSERT INTO @tableResponseText ([ResponseText]) EXEC sp_OAGetProperty @Object, 'responseText'

【讨论】:

以上是关于从 SQL Server 向 REST API 发送请求并检查返回的 http 代码的主要内容,如果未能解决你的问题,请参考以下文章

使用 Apollo-Server-Express 从服务器中使用光标分页查询 REST API

如何使用 REST api 将新文档添加到 Content Server 10.5

如何使用 Wordpress REST api 从 Vuejs 向 Contact-Form-7 发送消息?

无法从 reactjs 中的 axios 向 id=1 文章的 django REST API 后端发出 GET 请求

Apollo Server:如何从 REST API 数据源访问 Dataloader 中解析器之外的“上下文”

将数据从 rest api 推送到 sql 数据库的最佳方法是啥?