如何将存储过程的主体传递到 REST 服务?

问题描述 投票:0回答:3

我希望能够将 json 消息发布到 REST 服务。我可以使用 google-search 中的示例进行 GET 调用

Declare @Object as Int;
Declare @ResponseText as Varchar(8000);

Exec sp_OACreate 'MSXML2.XMLHTTP', @Object OUT;
Exec sp_OAMethod @Object, 'open', NULL, 'get',
'http://www.webservicex.com/stockquote.asmx/GetQuote?symbol=MSFT', 
    --Your Web Service Url (invoked)    'false'

Exec sp_OAMethod @Object, 'send'
Exec sp_OAMethod @Object, 'responseText', @ResponseText OUTPUT

Select @ResponseText

Exec sp_OADestroy @Object

我尝试了以下不同的变体:

Declare @Object as Int;
Declare @ResponseText as Varchar(8000);
DECLARE @hResult int
DECLARE @source varchar(255), @desc varchar(255) 
declare @Body as varchar(8000) = 
'{
    "Subsystem": 1,
    "Exception": "",
    "Message": "I have done what you asked",
    "Time": "2014-06-09T11:16:35",
    "Attribute": { "Number of attempts": "0" }
}' 

Exec sp_OACreate 'MSXML2.XMLHTTP', @Object OUT;
EXEC sp_OAMethod @Object, 'open', NULL, 'post', 
    'https://thecorrecturl:446/api/handelse/', 'false'
Exec sp_OAMethod @Object, 'setRequestHeader', null, 'Content-Type', 'application/json'

declare @len int
set @len = len(@body)
EXEC sp_OAMethod @Object, 'setRequestHeader', null, 'Content-Length', @len
Exec sp_OAMethod @Object, 'setRequestBody', null, 'Body', @body
EXEC sp_OAMethod @Object, 'send', null
Exec sp_OAMethod @Object, 'responseText', @ResponseText OUTPUT

Select @ResponseText
Exec sp_OADestroy @Object

我返回的 ResponseText 是无所不能的“{”Message”:“发生错误。”}”

任何人都可以指出我正确的方向来做到这一点,或者只是给出正确的方法来做到这一点;)

我已使用 GET 调用我的网址并从服务中获取了正确的handelse。

问候 卡罗琳

sql json rest post
3个回答
20
投票

卡罗琳的解决方案:

我的一位同事偶然发现了解决方案

而不是使用

Exec sp_OACreate 'MSXML2.XMLHTTP', @Object OUT;

我们用过

Exec sp_OACreate 'MSXML2.ServerXMLHTTP', @Object OUT;

向我们的服务发布handelse的最终结果如下

Declare @Object as Int;
Declare @ResponseText as Varchar(8000);
Declare @Body as varchar(8000) = 
'{
    "Subsystem": 1,
    "Exception": "",
    "Message": "I have done what you asked",
    "Time": "2014-06-09T11:16:35",
    "Attribute": { "Number of attempts": "0" }
}'  

Exec sp_OACreate 'MSXML2.ServerXMLHTTP', @Object OUT;
EXEC  sp_OAMethod @Object, 'open', NULL, 'post','https://thecorrecturl:446/api/handelse/', '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

希望这对其他人有帮助

问候 卡罗琳


0
投票

Brian 查询工作正常。 我想要 API 密钥添加以下行

declare @apikey as nvarchar(32) = 'your api key';     
..
/*after content-type*/
exec sp_OAMethod @object, 'setRequestHeader', null, 'ApiKey', @apikey
...

0
投票

Brian 的答案基本上就是你所要求的,尽管我也会添加一些调试,结果是这样的:

EXEC @hResult = sp_OAMethod @Object, 'responseText', @return OUTPUT
IF @hResult <> 0
BEGIN
    EXEC sp_OAGetErrorInfo @Object, @source OUT, @desc OUT
    SELECT hResult = convert(varbinary(4), @hResult),
           source = @source,
           description = @desc,
           FailPoint = 'ResponseText failed'
    goto destroy
    return
END

您可以在 sp_OAMethod 调用的每个步骤中执行此操作,这样您就知道失败的地方。

但是,请记住 sp_OAMethod 'responseText' 有一个限制,它无法处理大于 varchar(8000) 的输出

此外,由于您提到您正在使用 JSON,因此应按照以下方式处理答案:

SELECT * FROM OPENJSON(@return, '$.response') 
WITH (
    Item nvarchar(255) '$.item',
    Description nvarchar(255) '$.description',
    ...
)

有了这个,您应该能够读取 JSON 响应,并将每个字段作为一列,以便稍后可以更好地使用。

请注意,您可能必须为大多数 API 设置额外的“授权”标头。

© www.soinside.com 2019 - 2024. All rights reserved.