Конференция "Базы" » Из хранимки по https с авторизацией спросить внешний ресурс [MSSQL]
 
  • ВладОшин © (26.03.15 11:12) [0]
    .. не совсем по делфи

    есть задача из хранимой процедуры запросить внешний сервер
    подправлял до этого примеры для 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 #Test
    select @i = 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
    а как побороть?

    или вообще, может не так(не через этот объект) лучше делать? (но попробовал уже их много. Не могу правильно выставить подавление ошибки сертификата ни в одном)
  • junglecat © (26.03.15 11:16) [1]
    'setRequestHeader' 'Content-Encoding' ?
    или charset в content-type
  • ВладОшин © (26.03.15 11:31) [2]
    если взять 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?wsdl
    Request 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
  • junglecat © (26.03.15 11:36) [3]
    а не достаточно ли?
    content-type='application/xml;charset=utf-8'
  • junglecat © (26.03.15 11:52) [4]
    либо text/xml
  • ухты © (26.03.15 11:57) [5]
    clr процедуру сделайте, и проще и мощнее
  • ВладОшин © (26.03.15 12:19) [6]
    >> 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 процедуру сделайте, и проще

    да.. наверное надо

    зы
    давно еще правда, но был негативный опыт с ними..
    но, скорее, от собств.криворукости
  • junglecat © (26.03.15 12:37) [7]
    ну, можно еще попробовать sp_OACreate 'WinHttp.WinHttpRequest.5'
  • кгшзх © (26.03.15 13:20) [8]
    попробуй из респонса брать не resp.responseText
    а
    resp.responseXML

    если ответ прилетел в xml то в resp.responseXML готовый дом-объект лежит.
  • sniknik © (26.03.15 15:58) [9]
    > вообще похоже ничего не возвращается
    было что-то похожее, в дельфе правда, возвращало в юникоде хотя везде прописано win1251, в итоге чтение текста натыкалось на #0 в самом начале, хотя текст был...
    "исправил" (просто достало разбираться, что еще нужно, и зависит ли только от клиента, а сервер само собой не доступен) так -
    ...
       win.send(EmptyParam);

       if not win.WaitForResponse(Timeout) then
         raise Exception.Create('Время ожидания ответа истекло.');

       Bytes:= win.ResponseBody;     //вместо win.ResponseText;
       i    := Length(Bytes);        //
       SetLength(result, i);         //
       Move(Bytes[0], result[1], i); //обход "умного" преобразования из юникода, когда его не просят...


    ...
  • кгшзх © (26.03.15 20:23) [10]
    все так и должно быть.
    в аяксе только utf-8 и ничего больше.
  • ВладОшин © (27.03.15 19:12) [11]
    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
    процедура завершается
  • ВладОшин © (31.03.15 23:33) [12]

    > процедура на insert в таблу (id req resp)
    > вставляем req, берем id = scope_identity(), запускаем через
    > cmdshell консольник, с параметром paramstr(1)  = id
    > консольник по id считывает запрос, все делает, по результату
    > update по id  поля resp
    > процедура завершается

    нормально получилось

    если кто будет делать аля также - надо отключить DEP
    или пользовать новые версии
    или скачать апдейт для соап, но там только с 7ки по 2005 кажись
    (один фиг у нас 6ка:))
  • Дмитрий С © (05.04.15 15:08) [13]

    > WinHttpRequest.5 - не получается проигнорить истекший сертификат
    > options или setoptions  
    > и в разных комбинациях параметры - никак.

    На крайний случай установи сертификат web-сервера на машину с SQL сервером.
 
Конференция "Базы" » Из хранимки по https с авторизацией спросить внешний ресурс [MSSQL]
Есть новые Нет новых   [118427   +5][b:0][p:0.003]