-
.. не совсем по делфи есть задача из хранимой процедуры запросить внешний сервер подправлял до этого примеры для http без авторизации, для https с авторизацией и без - все через простой winHttpRequest а сейчас нужно для https с авторизацией + у них просрочен сертификат, т.е. надо подавить ошибку крайний мой код такой
set nocount on
declare @obj int, @ret int, @text varchar(max), @url varchar(max), @responseText varchar(8000)
select @url = 'https://WWWWWWW.net/soap/ordagent.php?wsdl' -- для примера, хотя бы wsdl получить
exec @ret = sp_OACreate 'MSXML2.ServerXMLHTTP.3.0', @obj out
IF @ret <> 0 begin exec sp_OAGetErrorInfo @obj print -1 end
print 1
exec @ret = sp_OAMethod @obj, 'Open', null, 'GET', @url, 'False', 'Login', 'Password'
if @ret <> 0 begin exec sp_OAGetErrorInfo @obj print -2 end
print 2
--exec @ret = sp_OAMethod @obj, 'setRequestHeader', null, 'Authorization', 'Basic YXN0cmFwYWdlOlZnN3NPNEFVcnU='
--if @ret <> 0 begin exec sp_OAGetErrorInfo @obj print -3 end
--print 3
--EXEC @ret = sp_OAMethod @obj, 'SetCredentials', null, 'Login', 'Password', '0'
--if @ret <> 0 exec sp_OAGetErrorInfo @obj
--print 4
exec @ret = sp_OAMethod @obj, 'setRequestHeader', null, 'Content-Type', 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8' -- так браузер отсылает, если смотреть его обмен
if @ret <> 0 begin exec sp_OAGetErrorInfo @obj print -5 end
print 5
exec @ret = sp_OAMethod @obj, 'setRequestHeader', null, 'Accept-Encoding', 'gzip, deflate, sdch'
if @ret <> 0 begin exec sp_OAGetErrorInfo @obj print -51 end
print 51
exec @ret = sp_OAMethod @obj, 'setRequestHeader', null, 'Accept-Language', 'ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4'
if @ret <> 0 begin exec sp_OAGetErrorInfo @obj print -52 end
print 52
exec @ret = sp_OAMethod @obj, 'setOption', null, 2 ,13056 -- игнорировать сертификат. Просрочен у них
if @ret <> 0 begin exec sp_OAGetErrorInfo @obj print -6 end
print 6
EXEC @ret = sp_OAMethod @obj, 'SEND'
if @ret <> 0 begin exec sp_OAGetErrorInfo @obj print -7 end
print 7
declare @i int =0, @n int = 0;
while @i < 9
begin
EXEC @ret = sp_OAMethod @obj, 'readyState', @n out
print ' while @i :' + cast( @n as varchar(99))
set @i = @i + 1
waitfor delay '00:00:01'
if @n = 4
set @i = 99
end
exec droptt '#Test'
CREATE TABLE #Test(strBStrValue nTEXT)
exec droptt '#Test2'
CREATE TABLE #Test2(strValue varchar(8000))
INSERT #Test
EXEC @ret = sp_OAGetProperty @obj, 'responsetext'--,@responseText out
if @ret <> 0 begin exec sp_OAGetErrorInfo @obj print -8 end
print 8
insert into #Test2 select strBStrValue from #Test
select @n = count from #Test2
print 'строк в таблах ' +cast( @n as varchar(99)) + ' ' + cast( @i as varchar(99))
выввод
1
2
5
51
52
6
7
while @i :4
-8
8
строк в таблах 0 0
-8 0xC00CE56E msxml3.dll Системная ошибка: -1072896658. NULL 0 гугл говорит, что 0xC00CE56E это XML_E_INVALIDENCODING а как побороть?или вообще, может не так(не через этот объект) лучше делать? (но попробовал уже их много. Не могу правильно выставить подавление ошибки сертификата ни в одном)
-
'setRequestHeader' 'Content-Encoding' ? или charset в content-type
-
если взять 6-ой exec @ret = sp_OACreate 'MSXML2.ServerXMLHTTP.6.0', @obj out то 0xC00CE56E msxml6.dll Указанная кодировка не поддерживается. NULL 0 если exec @ret = sp_OAMethod @obj, 'setRequestHeader', null, 'Content-Encoding', 'utf-8' if @ret <> 0 begin exec sp_OAGetErrorInfo @obj print -53 end print 53 или exec @ret = sp_OAMethod @obj, 'setRequestHeader', null, 'Content-Encoding', 'utf8' if @ret <> 0 begin exec sp_OAGetErrorInfo @obj print -53 end print 53 то ничего не меняется - 0xC00CE56E ------ если смотреть обмен браузера, то обмен идет одним запросом и таков ------ Remote Address:xxx.xxxx.161.1:443 Request URL: https://xxxxxxxxx/soap/ordagent.php?wsdlRequest Method:GET Status Code:200 OK Request Headersview source Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 Accept-Encoding:gzip, deflate, sdch Accept-Language:ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4 Authorization:Basic YXN0cmFwYWdlOlZnN3NPNEFVcnU= Cache-Control:max-age=0 Connection:keep-alive Cookie:PHPSESSID=ageorir4s02jakt2dv9j15bu86 DNT:1 Host:agent.2com.net User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36 Query String Parametersview sourceview URL encoded wsdl: Response Headersview source Cache-Control:no-store, no-cache, must-revalidate, post-check=0, pre-check=0 Connection:Keep-Alive Content-Type:text/xml; charset=utf8 Date:Thu, 26 Mar 2015 08:23:55 GMT Expires:Thu, 19 Nov 1981 08:52:00 GMT Keep-Alive:timeout=15, max=99 Pragma:no-cache Server:Apache Transfer-Encoding:chunked X-Powered-By:PHP/5.2.12
-
а не достаточно ли? content-type='application/xml;charset=utf-8'
-
либо text/xml
-
clr процедуру сделайте, и проще и мощнее
-
>> junglecat © (26.03.15 11:36) [3] [4] не, не проходит
вообще похоже ничего не возвращается
EXEC @ret = sp_OAMethod @obj, 'getResponseHeader', null, @responseText out print 'getResponseHeader: '+isnull(@responseText,'NULL') --getResponseHeader:NULL
> ухты © (26.03.15 11:57) [5] > clr процедуру сделайте, и проще
да.. наверное надо
зы давно еще правда, но был негативный опыт с ними.. но, скорее, от собств.криворукости
-
ну, можно еще попробовать sp_OACreate 'WinHttp.WinHttpRequest.5'
-
попробуй из респонса брать не resp.responseText а resp.responseXML
если ответ прилетел в xml то в resp.responseXML готовый дом-объект лежит.
-
> вообще похоже ничего не возвращается было что-то похожее, в дельфе правда, возвращало в юникоде хотя везде прописано win1251, в итоге чтение текста натыкалось на #0 в самом начале, хотя текст был... "исправил" (просто достало разбираться, что еще нужно, и зависит ли только от клиента, а сервер само собой не доступен) так - ... win.send(EmptyParam);
if not win.WaitForResponse(Timeout) then
raise Exception.Create('Время ожидания ответа истекло.');
Bytes:= win.ResponseBody; i := Length(Bytes); SetLength(result, i); Move(Bytes[0], result[1], i); ...
-
все так и должно быть. в аяксе только utf-8 и ничего больше.
-
WinHttpRequest.5 - не получается проигнорить истекший сертификат options или setoptions и в разных комбинациях параметры - никак.
> кгшзх ©
дык, если хидера нет, что там еще есть..
> sniknik © (26.03.15 15:58) [9]
не, в делфе все нормально вижу сгенерил по wsdl типы/интерфейсы, посылаю-принимаю - ok все нормально выставляется насчет игноров непоняток всяких
вообще, подумал: что через xp_cmdshell сделаю - так и повесить систему нет риска, и утечки всякие побоку - оно все равно только на один запрос - запустилось, отработало, закрылось
процедура на insert в таблу (id req resp) вставляем req, берем id = scope_identity(), запускаем через cmdshell консольник, с параметром paramstr(1) = id консольник по id считывает запрос, все делает, по результату update по id поля resp процедура завершается
-
> процедура на insert в таблу (id req resp) > вставляем req, берем id = scope_identity(), запускаем через > cmdshell консольник, с параметром paramstr(1) = id > консольник по id считывает запрос, все делает, по результату > update по id поля resp > процедура завершается
нормально получилось
если кто будет делать аля также - надо отключить DEP или пользовать новые версии или скачать апдейт для соап, но там только с 7ки по 2005 кажись (один фиг у нас 6ка:))
-
> WinHttpRequest.5 - не получается проигнорить истекший сертификат > options или setoptions > и в разных комбинациях параметры - никак.
На крайний случай установи сертификат web-сервера на машину с SQL сервером.
|