Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 如何通过将HTTP POST与T-SQL和OLE自动化过程一起使用来发送参数_Sql Server_Http_Post_Soap_Parameters - Fatal编程技术网

Sql server 如何通过将HTTP POST与T-SQL和OLE自动化过程一起使用来发送参数

Sql server 如何通过将HTTP POST与T-SQL和OLE自动化过程一起使用来发送参数,sql-server,http,post,soap,parameters,Sql Server,Http,Post,Soap,Parameters,我正在使用OLE自动化过程向SOAP Web服务发送HTTP POST请求并处理返回的数据。通过使用下面截取的代码,这对我来说很好。现在我需要将POST参数传递给webservice。 你知道我怎么做吗 参数:searchstring 值:V34432221 DECLARE @XMLResponse xml DECLARE @obj INT DECLARE @ValorDeRegreso INT DECLARE @sUrl NVARCHAR(200) DECLARE @response VARC

我正在使用OLE自动化过程向SOAP Web服务发送HTTP POST请求并处理返回的数据。通过使用下面截取的代码,这对我来说很好。现在我需要将POST参数传递给webservice。 你知道我怎么做吗

参数:searchstring
值:V34432221

DECLARE @XMLResponse xml
DECLARE @obj INT
DECLARE @ValorDeRegreso INT
DECLARE @sUrl NVARCHAR(200)
DECLARE @response VARCHAR(MAX)
DECLARE @hr INT
DECLARE @src NVARCHAR(255)
DECLARE @desc NVARCHAR(255)
SET @sUrl = 'http://server/Webservice/Service1.asmx/Suche'
EXEC sp_OACreate 'MSXML2.ServerXMLHttp', @obj OUT
EXEC sp_OAMethod @obj, 'Open', NULL, 'POST', @sUrl, false
EXEC sp_OAMethod @obj, 'send'
EXEC sp_OAGetProperty @obj, 'responseText', @XMLResponse OUT
--process @XMLResponse...
也许这样行得通:

DECLARE @XMLResponse xml
DECLARE @obj INT
DECLARE @ValorDeRegreso INT
DECLARE @sUrl NVARCHAR(200)
DECLARE @response VARCHAR(MAX)
DECLARE @hr INT
DECLARE @src NVARCHAR(255)
DECLARE @desc NVARCHAR(255)
DECLARE @StringRequest NVARCHAR(500)
SET @StringRequest = 'searchstring=V34432221'
SET @sUrl = 'http://server/Webservice/Service1.asmx/Suche'
EXEC sp_OACreate 'MSXML2.ServerXMLHttp', @obj OUT
EXEC sp_OAMethod @obj, 'Open', NULL, 'POST', @sUrl, false
EXEC sp_OAMethod @obj, 'setRequestHeader', NULL, 'Content-Type', 'application/x-www-form-urlencoded'
EXEC sp_OAMethod @obj, 'send', NULL, @StringRequest
EXEC sp_OAGetProperty @obj, 'responseText', @XMLResponse OUT
--process @XMLResponse...

EXEC sp_OAMethod@obj,'send',NULL,@StringRequest工作正常。 这是我的代码,如果有帮助的话:

Declare @Objet as Int
Declare @Reponse as Varchar(8000)
Declare @url VARCHAR(3000)
Declare @Parametres VARCHAR(3000)
Declare @Erreur int
Declare @MessageErreur varchar(255)
Declare @MessageErreurAvecNumero varchar(255)
Declare @Statut int

SET @url = 'http://localhost/MonWebservice/MaPage.asmx/maFonction'
SET @Parametres = 'theIDMachin=' + cast('268029' as varchar)
SET @Parametres = @Parametres + '&theTypeMachin=' + cast('1' as varchar)
SET @Parametres = @Parametres + '&theBooleen=False'
SET @Parametres = @Parametres + '&theStatut=' + cast('0' as varchar)

exec @Erreur = sp_OACreate 'MSXML2.ServerXMLHttp', @Objet OUT;
if @Erreur <> 0 begin set @MessageErreur = 'sp_OACreate MSXML2.ServerXMLHttp.3.0 failed' goto fin end

exec @Erreur = sp_OAMethod @Objet, 'open', NULL, 'POST', @url, false            
if @Erreur <> 0 begin set @MessageErreur = 'sp_OAMethod Open failed' goto fin end

exec @Erreur = sp_OAMethod @Objet, 'setRequestHeader', NULL, 'Content-Type', 'application/x-www-form-urlencoded'
if @Erreur <> 0 begin set @MessageErreur = 'sp_OAMethod setRequestHeader failed' goto fin end

exec @Erreur = sp_OAMethod @Objet, 'send', NULL, @Parametres
if @Erreur <> 0 begin set @MessageErreur = 'sp_OAMethod Send failed' goto fin end

exec @Erreur = sp_OAGetProperty @Objet, 'status', @Statut OUT
if @Erreur <> 0 begin set @MessageErreur = 'sp_OAGetProperty read status failed' goto fin end

exec @Erreur = sp_OAMethod @Objet, 'responseText', @Reponse OUTPUT
if @Erreur <> 0 begin set @MessageErreur = 'sp_OAMethod read response failed' goto fin end

select @Reponse

exec sp_OADestroy @Objet
return

fin:
print @MessageErreur
exec sp_OADestroy @Objet
SET @MessageErreurAvecNumero = 'Erreur : ' + cast(@Erreur as varchar) + ' - ' + >@MessageErreur
Raiserror(@MessageErreurAvecNumero, 16, 1)
return
将@Objet声明为Int
将@Reponse声明为Varchar(8000)
声明@url VARCHAR(3000)
声明@Parameters VARCHAR(3000)
声明@Erreur int
声明@MessageErreur varchar(255)
声明@MessageErreurAvecNumero varchar(255)
声明@Statut int
设置@url=http://localhost/MonWebservice/MaPage.asmx/maFonction'
将@Parameters='TheidMachine='+cast('268029'设置为varchar)
将@Parameters=@Parameters+'&类型机='+cast('1'作为varchar)
设置@Parametres=@Parametres+'&theBooleen=False'
将@Parametres=@Parametres+'&theStatut='+cast('0'设置为varchar)
exec@Erreur=sp_OACreate'MSXML2.ServerXMLHttp',@Objet OUT;
如果@Erreur 0 begin set@MessageErreur='sp_OACreate MSXML2.ServerXMLHttp.3.0失败'goto fin end
exec@Erreur=sp_OAMethod@Objet,'open',NULL',POST',@url,false
如果@Erreur 0 begin set@MessageErreur='sp_OAMethod Open failed'转到fin end
exec@Erreur=sp_OAMethod@Objet,'setRequestHeader',NULL,'Content Type','application/x-www-form-urlencoded'
如果@Erreur 0 begin set@MessageErreur='sp_方法setRequestHeader失败'goto fin end
exec@Erreur=sp_OAMethod@Objet,'send',NULL,@Parametres
如果@Erreur 0 begin set@MessageErreur='sp_OAMethod Send failed'转到fin end
exec@Erreur=sp_OAGetProperty@Objet,“status”,status OUT
如果@Erreur 0 begin set@MessageErreur='sp_OAGetProperty read status failed'转到fin end
exec@Erreur=sp_OAMethod@Objet,'responseText',@response输出
如果@Erreur 0 begin set@MessageErreur='sp_方法读取响应失败'goto fin end
选择@response
Objet执行官sp_OADestroy
返回
鳍:
打印@MessageErreur
Objet执行官sp_OADestroy
SET@MessageErreurAvecNumero='Erreur:'+cast(@Erreur as varchar)+'-'+>@MessageErreur
Raiserror(@MessageErreurAvecNumero,16,1)
返回

所以我知道这大概是3年后的事了,你可能不再有这个问题了。。。但我回答是因为我遇到了这个问题,我花了太多时间寻找你问题的答案。因此,有可能一些可怜的sap会来寻找同样的问题,他们会有一个答案

编辑:必须确保启用OLE自动化,此代码才能工作

EXEC sp_configure 'Ole Automation Procedures', 1;
GO

RECONFIGURE;
GO
您可以使用以下变体从T-SQL执行HTTP Post:

DECLARE @authHeader NVARCHAR(64);
DECLARE @contentType NVARCHAR(64);
DECLARE @postData NVARCHAR(2000);
DECLARE @responseText NVARCHAR(2000);
DECLARE @responseXML NVARCHAR(2000);
DECLARE @ret INT;
DECLARE @status NVARCHAR(32);
DECLARE @statusText NVARCHAR(32);
DECLARE @token INT;
DECLARE @url NVARCHAR(256);

SET @authHeader = 'BASIC 0123456789ABCDEF0123456789ABCDEF';
SET @contentType = 'application/x-www-form-urlencoded';
SET @postData = 'value1=Hello&value2=World'
SET @url = 'https://requestb.in/16xdq1p1'

-- Open the connection.
EXEC @ret = sp_OACreate 'MSXML2.ServerXMLHTTP', @token OUT;
IF @ret <> 0 RAISERROR('Unable to open HTTP connection.', 10, 1);

-- Send the request.
EXEC @ret = sp_OAMethod @token, 'open', NULL, 'POST', @url, 'false';
EXEC @ret = sp_OAMethod @token, 'setRequestHeader', NULL, 'Authentication', @authHeader;
EXEC @ret = sp_OAMethod @token, 'setRequestHeader', NULL, 'Content-type', @contentType;
EXEC @ret = sp_OAMethod @token, 'send', NULL, @postData;

-- Handle the response.
EXEC @ret = sp_OAGetProperty @token, 'status', @status OUT;
EXEC @ret = sp_OAGetProperty @token, 'statusText', @statusText OUT;
EXEC @ret = sp_OAGetProperty @token, 'responseText', @responseText OUT;

-- Show the response.
PRINT 'Status: ' + @status + ' (' + @statusText + ')';
PRINT 'Response text: ' + @responseText;

-- Close the connection.
EXEC @ret = sp_OADestroy @token;
IF @ret <> 0 RAISERROR('Unable to close HTTP connection.', 10, 1);
DECLARE@authHeader-NVARCHAR(64);
声明@contenttypenvarchar(64);
声明@postdatanvarchar(2000年);
宣布@responseText NVARCHAR(2000年);
声明@responseXML NVARCHAR(2000年);
声明@retint;
声明@status NVARCHAR(32);
声明@statusText NVARCHAR(32);
声明@tokenint;
声明@url NVARCHAR(256);
SET@authHeader='BASIC 0123456789ABCDEF0123456789ABCDEF';
SET@contentType='application/x-www-form-urlencoded';
SET@postData='value1=Hello&value2=World'
设置@url=https://requestb.in/16xdq1p1'
--打开连接。
EXEC@ret=sp_OACreate'MSXML2.ServerXMLHTTP',@token OUT;
如果@ret 0出现错误('无法打开HTTP连接',10,1);
--发送请求。
EXEC@ret=sp_OAMethod@token'open',NULL',POST',@url'false';
EXEC@ret=sp_OAMethod@token,'setRequestHeader',NULL,'Authentication',@authHeader;
EXEC@ret=sp_OAMethod@token,'setRequestHeader',NULL,'Content-type',@contentType;
EXEC@ret=sp_OAMethod@token'send',NULL,@postData;
--处理响应。
EXEC@ret=sp_OAGetProperty@token,'status',@status OUT;
EXEC@ret=sp_OAGetProperty@token,'statusText',@statusText OUT;
EXEC@ret=sp_OAGetProperty@token,'responseText',@responseText-OUT;
--显示响应。
打印“状态:'+@Status++'('+@statusText++');
打印“响应文本:”+@responseText;
--关闭连接。
EXEC@ret=sp_OADestroy@token;
如果@ret 0出现错误('无法关闭HTTP连接',10,1);

@alireza在运行代码之前是否启用了OLE自动化?请参见上文编辑的corse代码Yes!!其他一些代码可以正常工作,但此代码不起作用。@alireza,你能更具体地说明哪些代码不起作用吗?我在这里调用的示例服务似乎已关闭。您需要交换URL并发布到不同的端点。我,我成功地尝试了您的示例,是否可以通过mqtt执行相同的操作?那么从mssql中的触发器/存储过程发布mqtt消息(从mssql到外部代理)?