nir*_*ren 15 sql-server tomcat
我想从SQL服务器向Tomcat服务器发送HTTP请求.我在Tomcat服务器上安装了SQL Server 2012 express和非.NET应用程序.我已经完成了这一点,比如从SQL服务器发出HTTP请求
正如在上面的文章中所说,"必须在服务器上安装COM对象WinHttp.WinHttpRequest.5.1,一些典型的变体是WinHttp.WinHttpRequest.5".我从winhttp下载链接下载了 winhttp.zip,在zip文件夹中找到了winhttp.dll,并C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER2\MSSQL\Binn按照这个msdn链接中的建议将其粘贴.
遵循同样的建议,我在SSMS中执行了以下行:
sp_addextendedproc 'GetHttp',
'C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER2\MSSQL\Binn\winhttp.dll';
Run Code Online (Sandbox Code Playgroud)
我还在SSMS中执行了以下代码,如"从SQL服务器链接发出HTTP请求"中所述:
Alter function GetHttp
(
@url varchar(8000)
)
returns varchar(8000)
as
BEGIN
DECLARE @win int
DECLARE @hr int
DECLARE @text varchar(8000)
EXEC @hr=sp_OACreate 'WinHttp.WinHttpRequest.5.1',@win OUT
IF @hr <> 0 EXEC sp_OAGetErrorInfo @win
EXEC @hr=sp_OAMethod @win, 'Open',NULL,'GET',@url,'false'
IF @hr <> 0 EXEC sp_OAGetErrorInfo @win
EXEC @hr=sp_OAMethod @win,'Send'
IF @hr <> 0 EXEC sp_OAGetErrorInfo @win
EXEC @hr=sp_OAGetProperty @win,'ResponseText',@text OUTPUT
IF @hr <> 0 EXEC sp_OAGetErrorInfo @win
EXEC @hr=sp_OADestroy @win
IF @hr <> 0 EXEC sp_OAGetErrorInfo @win
RETURN @text
END
Run Code Online (Sandbox Code Playgroud)
然后我得到了错误
消息2010,级别16,状态1,过程GetHttp,第2行
无法对'GetHttp'执行更改,因为它是不兼容的对象类型.
我不知道如何调用该函数来发送HTTP请求.我认为它是这样的GetHttp('http://www.google.co.in/').
我错过了什么?
nir*_*ren 14
我也得到了另一个答案.我创建了如下的程序
CREATE procedure HTTP_Request( @sUrl varchar(200))
As
Declare
@obj int
,@hr int
,@msg varchar(255)
exec @hr = sp_OACreate 'MSXML2.ServerXMLHttp', @obj OUT
if @hr <> 0 begin Raiserror('sp_OACreate MSXML2.ServerXMLHttp.3.0
failed', 16,1) return end
exec @hr = sp_OAMethod @obj, 'open', NULL, 'POST', @sUrl, false
if @hr <>0 begin set @msg = 'sp_OAMethod Open failed' goto eh end
exec @hr = sp_OAMethod @obj, 'setRequestHeader', NULL, 'Content-Type',
'application/x-www-form-urlencoded'
if @hr <>0 begin set @msg = 'sp_OAMethod setRequestHeader failed' goto
eh end
exec @hr = sp_OAMethod @obj, send, NULL, ''
if @hr <>0 begin set @msg = 'sp_OAMethod Send failed' goto eh end
exec @hr = sp_OADestroy @obj
return
eh:
exec @hr = sp_OADestroy @obj
Raiserror(@msg, 16, 1)
return
GO
Run Code Online (Sandbox Code Playgroud)
我用url调用了存储过程
USE [master]
GO
DECLARE @return_value int
EXEC @return_value = [dbo].[HTTP_Request]
@sUrl = N'url'
SELECT 'Return Value' = @return_value
GO
Run Code Online (Sandbox Code Playgroud)
谢谢大家让我这样做.
这里最灵活的方法是使用 CLR 用户定义函数,您可以简单地在 C# 中定义它,如下所示;
[Microsoft.SqlServer.Server.SqlFunction]
public static SqlString http(SqlString url)
{
var wc = new WebClient();
var html = wc.DownloadString(url.Value);
return new SqlString (html);
}
Run Code Online (Sandbox Code Playgroud)
完整的安装说明在这里 - https://github.com/infiniteloopltd/SQLHttp
我得到了powershell的回答.我所做的是在sql server中打开powershell,然后我在powershell中执行了以下代码.
$http_Request= New-Object system.Net.WebClient;
$Result = $http_Request.downloadString("url")
Run Code Online (Sandbox Code Playgroud)
这真的帮助了我@niren。
以为我会发布我的修正,将其置于标量函数中并允许您获得服务响应。唯一的缺点是标量函数不能引发错误,因此需要考虑在其他地方捕获。
CREATE function [dbo].[fn_HttpPOST]
(
@sUrl varchar(8000)
)
returns varchar(8000)
as
BEGIN
DECLARE @obj int
DECLARE @hr int
DECLARE @msg varchar(8000)
exec @hr = sp_OACreate 'MSXML2.ServerXMLHttp', @obj OUT
if @hr <> 0 begin set @Msg = 'sp_OACreate MSXML2.ServerXMLHttp.3.0 failed' return @Msg end
exec @hr = sp_OAMethod @obj, 'open', NULL, 'POST', @sUrl, false
if @hr <>0 begin set @msg = 'sp_OAMethod Open failed' goto eh end
exec @hr = sp_OAMethod @obj, 'setRequestHeader', NULL, 'Content-Type', 'application/x-www-form-urlencoded'
if @hr <>0 begin set @msg = 'sp_OAMethod setRequestHeader failed' goto eh end
exec @hr = sp_OAMethod @obj, send, NULL, ''
if @hr <>0 begin set @msg = 'sp_OAMethod Send failed' goto eh end
EXEC @hr=sp_OAGetProperty @Obj,'ResponseText',@msg OUTPUT
IF @hr <> 0 EXEC sp_OAGetErrorInfo @Obj
exec @hr = sp_OADestroy @obj
RETURN @msg
eh:
exec @hr = sp_OADestroy @obj
return @msg
END
Run Code Online (Sandbox Code Playgroud)
为了我自己的需要而制作了这个怪物
CREATE PROCEDURE [dbo].[RequestHttpWebService]
@Url varchar(1024),
@HttpMethod varchar(10),
@ParamsValues varchar(1024), -- param1=value¶m2=value
@SoapAction varchar(1024) = null
AS
BEGIN
SET NOCOUNT ON;
if @HttpMethod in ('get','GET') and len(@ParamsValues) > 0
begin
set @Url = @Url + '?' + @ParamsValues
end
declare @obj int
,@response varchar(8000)
,@responseXml xml
,@status varchar(50)
,@statusText varchar(1024)
,@method varchar(10) = (case when @HttpMethod in ('soap','SOAP') then 'POST' else @HttpMethod end)
exec sp_OACreate 'MSXML2.ServerXMLHttp', @obj out
exec sp_OAMethod @obj, 'Open', null, @method, @Url, false
if @HttpMethod in ('get','GET')
begin
exec sp_OAMethod @obj, 'send'
end
else if @HttpMethod in ('post','POST')
begin
exec sp_OAMethod @obj, 'setRequestHeader', null, 'Content-Type', 'application/x-www-form-urlencoded'
exec sp_OAMethod @obj, 'send', null, @ParamsValues
end
else if @HttpMethod in ('soap','SOAP')
begin
if @SoapAction is null
raiserror('@SoapAction is null', 10, 1)
declare @host varchar(1024) = @Url
if @host like 'http://%'
set @host = right(@host, len(@host) - 7)
else if @host like 'https://%'
set @host = right(@host, len(@host) - 8)
if charindex(':', @host) > 0 and charindex(':', @host) < charindex('/', @host)
set @host = left(@host, charindex(':', @host) - 1)
else
set @host = left(@host, charindex('/', @host) - 1)
declare @envelope varchar(8000) = '<?xml version="1.0" encoding="utf-8"?><soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><{action} xmlns="http://tempuri.org/">{params}</{action}></soap:Body></soap:Envelope>'
declare @params varchar(8000) = ''
WHILE LEN(@ParamsValues) > 0
BEGIN
declare @param varchar(256),
@value varchar(256)
IF charindex('&', @ParamsValues) > 0
BEGIN
SET @param = left(@ParamsValues, charindex('&', @ParamsValues) - 1)
set @value = RIGHT(@param, len(@param) - charindex('=', @param))
set @param = left(@param, charindex('=', @param) - 1)
set @params = @params + '<' + @param + '>' + @value + '</'+ @param + '>'
SET @ParamsValues = right(@ParamsValues, LEN(@ParamsValues) - LEN(@param + '=' + @value + '&'))
END
ELSE
BEGIN
set @value = RIGHT(@ParamsValues, len(@ParamsValues) - charindex('=', @ParamsValues))
set @param = left(@ParamsValues, charindex('=', @ParamsValues) - 1)
set @params = @params + '<' + @param + '>' + @value + '</'+ @param + '>'
SET @ParamsValues = NULL
END
END
set @envelope = replace(@envelope, '{action}', @SoapAction)
set @envelope = replace(@envelope, '{params}', @params)
set @SoapAction = 'http://tempuri.org/' + @SoapAction
print @host
print @SoapAction
print @envelope
exec sp_OAMethod @obj, 'setRequestHeader', null, 'Content-Type', 'text/xml; charset=utf-8'
exec sp_OAMethod @obj, 'setRequestHeader', null, 'Host', @host
exec sp_OAMethod @obj, 'setRequestHeader', null, 'SOAPAction', @SoapAction
exec sp_OAMethod @obj, 'send', null, @envelope
end
exec sp_OAGetProperty @obj, 'responseText', @response out
exec sp_OADestroy @obj
select @status as [status], @statusText as [statusText], @response as [response]
END
GO
Run Code Online (Sandbox Code Playgroud)