从 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 请求