为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

PHP
炎炎设计 2021-11-05 16:09:13
我正在尝试将 json 数据发送到 rest API,最好是从 SQL Server 2016 发送。我遇到了以下使用 sp_OAMethod 的代码(来自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, @bodyEXEC sp_OAMethod @Object, 'responseText', @ResponseText OUTPUTSELECT @ResponseTextEXEC sp_OADestroy @Object理想情况下,我会看到“200”或“400”作为每个请求的响应,并且我可以在存储过程运行后解析它们。非常欢迎任何帮助或建议。谢谢
查看完整描述

2 回答

?
冉冉说

TA贡献1877条经验 获得超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


查看完整回答
反对 回复 2021-11-05
?
梦里花落0921

TA贡献1772条经验 获得超6个赞

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


DECLARE @tableResponseText TABLE (

    [ResponseText] VARCHAR(MAX)

    )

您的设置/发送语句


收集响应数据


EXEC @RC = sp_OAGetProperty @Object, 'status', @HttpResponseCode OUT

INSERT INTO @tableResponseText ([ResponseText]) EXEC sp_OAGetProperty @Object, 'responseText'



查看完整回答
反对 回复 2021-11-05
  • 2 回答
  • 0 关注
  • 343 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信