Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 HTTPS over T-SQL  [new]
hollister
Member

Откуда: Дармштадт
Сообщений: 131
Коллеги, привет. подскажите пожалуйста, как обращаться к ресурсам HTTPS через T-SQL
Пример кода

DECLARE @win   INT
DECLARE @hr   INT
DECLARE @text   VARCHAR (MAX)
DECLARE @str   VARCHAR (100)
DECLARE @Result   NVARCHAR (MAX)
DECLARE @result   TABLE (result VARCHAR (MAX))
  
    EXEC @hr=sp_OACreate 'MSXML2.ServerXMLHttp',@win OUT 
    IF @hr <> 0 BEGIN 
		EXEC sp_OAGetErrorInfo @win
		select 2
	END

    EXEC @hr=sp_OAMethod @win, 'Open',NULL,'GET', 'https://api.direct.yandex.com','false'
    IF @hr <> 0 BEGIN 
		EXEC sp_OAGetErrorInfo @win
		select 3 
	END 
  

    EXEC @hr=sp_OAMethod @win,'Send', null
	IF @hr <> 0 BEGIN 
		EXEC sp_OAGetErrorInfo @win
	END 


	SELECT @Result = result FROM @result


выдает ответ
A certificate is required to complete client authentication
Хотя сертификат установлен, открываю на хосте с БД explorer и перехожу по ссылке - все ок.
Так же пытался сделать через WinHttp.WinHttpRequest.5.1, одинаковый результат

В MS SQL какое то свое хранилище сертификатов?
Прошу помочь

Заранее благодарен.
16 апр 18, 16:17    [21342870]     Ответить | Цитировать Сообщить модератору
 Re: HTTPS over T-SQL  [new]
Дедушка
Member

Откуда: Город трёх революций
Сообщений: 5114
поиск рулит
16 апр 18, 16:22    [21342885]     Ответить | Цитировать Сообщить модератору
 Re: HTTPS over T-SQL  [new]
hollister
Member

Откуда: Дармштадт
Сообщений: 131
Проблема именно в том, что с этим сайтом код не работает
https://api.direct.yandex.com

А если взять например какой нибудет https://habrahabr.ru/ или даже https://ya.ru - все ок

Что то странное
16 апр 18, 16:49    [21342974]     Ответить | Цитировать Сообщить модератору
 Re: HTTPS over T-SQL  [new]
hollister
Member

Откуда: Дармштадт
Сообщений: 131
Попробуйте у себя рабочий пример

declare @obj int, @ret  int, @text varchar(max), @url varchar(max)

select @url = 'https://api.direct.yandex.ru/'

exec @ret = sp_OACreate 'MSXML2.ServerXMLHTTP', @obj out
IF @ret <> 0 exec sp_OAGetErrorInfo @obj

exec @ret = sp_OAMethod @obj, 'Open', null, 'GET', @url, 'false'
if @ret <> 0 exec sp_OAGetErrorInfo @obj


exec @ret = sp_OAMethod @obj, 'setOption', null, 2 ,13056  -- игнорировать сертификат
if @ret <> 0 exec sp_OAGetErrorInfo @obj

EXEC @ret = sp_OAMethod @obj, 'SEND'
if @ret <> 0 exec sp_OAGetErrorInfo @obj

EXEC @ret = sp_OAGetProperty @obj, 'responsetext'
if @ret <> 0 exec sp_OAGetErrorInfo @obj
16 апр 18, 16:56    [21342993]     Ответить | Цитировать Сообщить модератору
 Re: HTTPS over T-SQL  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8485
hollister,

С# еще не освоили?
16 апр 18, 18:48    [21343271]     Ответить | Цитировать Сообщить модератору
 Re: HTTPS over T-SQL  [new]
Ролг Хупин
Member

Откуда: Чебаркуль
Сообщений: 4068
Владислав Колосов
hollister,

С# еще не освоили?


а смысл?
17 апр 18, 12:22    [21344963]     Ответить | Цитировать Сообщить модератору
 Re: HTTPS over T-SQL  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8485
Ролг Хупин,

очень простой - закрыть "черный ход" в виде OLE автоматизации.
17 апр 18, 16:37    [21346070]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: HTTPS over T-SQL  [new]
Двоичник
Member

Откуда: Бобруйск
Сообщений: 330
Что-то не смог победить подключение к веб-сервису

declare @username varchar (200) = 'USER'
declare @password varchar (200) = 'PASS'
declare @obj int
declare @sUrl varchar (200)
declare @response varchar (8000)
declare @hr int
declare @status INT
declare @statusText VARCHAR (200)
declare @source varbinary (max)
declare @auth varchar (max)

SET @source = CONVERT (varbinary (max), @username + ':' + @password) 

set @sUrl = 'https://mycompany.ru/my_soap/?wsdl'

SET @auth = 'BASIC ' + @username + ':' + @password
exec @hr = sp_OACreate 'MSXML2.ServerXMLhttp', @obj out
exec  @hr = sp_OAMethod @obj, 'setRequestHeader', null, 'Authorization', @auth
exec sp_OAMethod @obj, 'setRequestHeader', null, 'Accept', 'application/json'
exec @hr = sp_OAMethod @obj, 'Open', null, 'POST', @sUrl, false

exec sp_OAMethod @obj, 'send', null, @auth
exec sp_OAgetproperty @obj, 'responseText', @response out
exec sp_OAgetproperty @obj, 'status', @status out
exec sp_OAgetproperty @obj, 'StatusText', @statusText out
exec sp_OADestroy @obj
 
select @status [StatusCode], @statusText [StatusText], @response [Respuesta]


Но пишет, что не смог авторизоваться:

StatusCode - 401
StatusText - Unauthorized
Respuesta - NULL

Подскажите, пожалуйста

Через браузер с сервера по RDP запрашивает логин и пароль, после чего показывает XML сервиса

Как понять, почему не авторизовывается ?
Спасибо
21 дек 20, 14:40    [22251564]     Ответить | Цитировать Сообщить модератору
 Re: HTTPS over T-SQL  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8485
Двоичник,

так не делают, для взаимодействия с сервисами пишут отдельное приложение-контроллер или, в крайнем случае, CLR функцию.
Это классическая MVC модель.
21 дек 20, 17:52    [22251739]     Ответить | Цитировать Сообщить модератору
 Re: HTTPS over T-SQL  [new]
Сон Веры Павловны
Member

Откуда:
Сообщений: 6149
Двоичник
после чего показывает XML сервиса

Это WSDL сервиса. Если бы авторизация на сервисе прошла нормально, то следующим шагом была бы ручная сборка SOAP-разметки для вызова методов, описанных в WSDL, причем для каждого метода разметка своя. А потом получение ответного SOAP, и его разбор. А та же visual studio умеет по WSDL создавать типизированные обёртки для обращения к сервису, и весь хардкор с ручной сборкой и разбором SOAP-пакетов становится не нужным.
Двоичник
Как понять, почему не авторизовывается ?

Ну, например, потому, что при basic-авторизации authorization header формируется в виде строки Basic+кодированный в base64 результат конкатенации (через дветочие с пробелом) имени пользователя и пароля. А здесь перевода результата конкатенации в base64 я нигде не наблюдаю.
22 дек 20, 06:07    [22251968]     Ответить | Цитировать Сообщить модератору
 Re: HTTPS over T-SQL  [new]
aleks222
Member

Откуда:
Сообщений: 1291
Сон Веры Павловны
Двоичник
после чего показывает XML сервиса

А та же visual studio умеет по WSDL создавать типизированные обёртки для обращения к сервису, и весь хардкор с ручной сборкой и разбором SOAP-пакетов становится не нужным.


Уморил.
"Написать письмо" сервису раз в сто проще банальным replace-ом по шаблону.
Ну а "разбор SOAP-пакетов" делает либо sqlXmlBulkLoader, либо сам сервер.

Все эти обертки - великое тормозящее зло.
22 дек 20, 07:32    [22251972]     Ответить | Цитировать Сообщить модератору
 Re: HTTPS over T-SQL  [new]
Сон Веры Павловны
Member

Откуда:
Сообщений: 6149
aleks222
"Написать письмо" сервису раз в сто проще банальным replace-ом по шаблону.

Проще чем просто вызвать метод класса с нужными параметрами? Уморил.

aleks222
Все эти обертки - великое тормозящее зло.

Их тормозами можно пренебречь ввиду несоизмеримости задержек самих обёрток, и временем обращения собственно к сервису. В чем состоит остальное "зло"?
22 дек 20, 09:15    [22251995]     Ответить | Цитировать Сообщить модератору
 Re: HTTPS over T-SQL  [new]
Двоичник
Member

Откуда: Бобруйск
Сообщений: 330
Пока вы спорили о прекрасном, мне все же удалось авторизоваться на веб-сервисе. Хотя это вероятно и не правильно, в части шифрованной авторизации, но, так как это будет работать строго в Entranet, то этого достаточно

declare @postData varchar(255) = 'PostedString'
declare @Object as Int
declare @statusText varchar(255)
declare @status varchar(255)
declare @url varchar(255) = 'https://mycompany.ru/my_soap/?wsdl'
declare @user varchar(64) = 'USER'
declare @pass varchar(64) = 'PASS'
declare @t table (http ntext)

Exec sp_OACreate 'MSXML2.ServerXMLHTTP.3.0', @Object OUT;
Exec sp_OAMethod @Object, 'open', NULL, 'post', @url, 'false', @user, @pass;
EXEC sp_OAMethod @Object, 'setRequestHeader', NULL, 'Content-Type', 'application/x-www-form-urlencoded; charset=utf-8';
Exec sp_OAMethod @Object, 'send', NULL, @postData;
EXEC sp_OAGetProperty  @Object, 'status', @status OUT
EXEC sp_OAGetProperty  @Object, 'statustext', @statusText OUT
 
insert into @t
Exec sp_OAMethod @Object, 'responseText';

select http, datalength(http) from @t
 
Exec sp_OADestroy @Object;
  
select @status, @statusText


Единственно только я не понял, как отправить посылку @postData

Exec sp_OAMethod @Object, 'send', NULL, @postData;


Основная беда вся в том, что я делаю взаимодействие с вебсервисом впервые в жизни. А вебсервис пишет другой программист. И как оно это всё устроено, для меня пока темное.

Однако в
select http, datalength(http) from @t

Я весьма получаю XML как при обращении по ссылке на сервис браузером.

Внутри XML для меня якобы заготовлена ветка (фрагмент):

   <operation name="TEST">
      <soap12bind:operation style="document" soapAction="http://mycompany.ru/my_soap#my_soap:TEST" />
      <input>
        <soap12bind:body use="literal" />
      </input>
      <output>
        <soap12bind:body use="literal" />
      </output>
    </operation>
  </binding>
  <service name="my_soap">
    <port name="my_soapSoap" binding="tns:my_soapSoapBinding">
      <documentation>
        <wsi:Claim xmlns:wsi="http://ws-i.org/schemas/conformanceClaim/" conformsTo="http://ws-i.org/profiles/basic/1.1" />
      </documentation>
      <soapbind:address location="https://mycompany.ru/my_soap" />
    </port>
    <port name="my_soapSoap12" binding="tns:my_soapSoap12Binding">
      <soap12bind:address location="https://mycompany.ru/my_soap/" />
    </port>
  </service>


B вот как передать посылку в операцию TEST пока понимания нет и потом получить ответ.
Программист на стороне реализации сервиса утверждает, что авторизацию мою он видит, а вот посылку не видит.

Спасибо за помощь.

Сообщение было отредактировано: 22 дек 20, 10:29
22 дек 20, 10:34    [22252042]     Ответить | Цитировать Сообщить модератору
 Re: HTTPS over T-SQL  [new]
Двоичник
Member

Откуда: Бобруйск
Сообщений: 330
Сон Веры Павловны
... то следующим шагом была бы ручная сборка SOAP-разметки для вызова методов, описанных в WSDL, причем для каждого метода разметка своя. А потом получение ответного SOAP, и его разбор. ...

Очевидно я тут застрял. Но как сдвинуться дальше, пока не имею представления.
Фактически, программирую с чужих примеров и приемов
22 дек 20, 11:26    [22252067]     Ответить | Цитировать Сообщить модератору
 Re: HTTPS over T-SQL  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8485
Двоичник,

бросайте эти игры с OLE и пишите UNSAFE функцию на C#. Но это будет иметь последствия в удобстве сопровождения приложения и менее строгом уровне безопасности базы данных. Лучшее решение - написать отдельный "слой"-контроллер для взаимодействия с веб-сервисом.
22 дек 20, 11:43    [22252075]     Ответить | Цитировать Сообщить модератору
 Re: HTTPS over T-SQL  [new]
Двоичник
Member

Откуда: Бобруйск
Сообщений: 330
Владислав Колосов,

Навыков на C# практически нет. На Delphi малость могу... Но это обещает породить зоопарк в стэке
22 дек 20, 12:44    [22252111]     Ответить | Цитировать Сообщить модератору
 Re: HTTPS over T-SQL  [new]
aleks222
Member

Откуда:
Сообщений: 1291
Сон Веры Павловны
[Их тормозами можно пренебречь ввиду несоизмеримости задержек самих обёрток, и временем обращения собственно к сервису. В чем состоит остальное "зло"?


Все банально.
Говнокод, который пишут вокруг обертки требует изрядных затрат времени на написание.
Не говоря уж о нервах.
Когда с этим чудом сталкиваешься, внезапно.
22 дек 20, 16:53    [22252353]     Ответить | Цитировать Сообщить модератору
 Re: HTTPS over T-SQL  [new]
aleks222
Member

Откуда:
Сообщений: 1291
Двоичник
Владислав Колосов,

Навыков на C# практически нет. На Delphi малость могу... Но это обещает породить зоопарк в стэке


Вот эта хрень на powershell выполняет запрос к SOAP и пишет ответ в файл
function Execute-SOAPRequest-ToFile 
( 
        [String] $URL,
        [String] $Action,
        [Xml]    $SOAPRequest,
        [String] $File,
        [int]    $Timeout = 60000

) 
{ 
        $soapWebRequest = [System.Net.WebRequest]::Create($URL)
        $soapWebRequest.Timeout = $Timeout
        $soapWebRequest.Headers.Add("SOAPAction" , $Action ) 

        $soapWebRequest.ContentType = 'text/xml;charset=utf-8' 
        $soapWebRequest.Accept      = $soapWebRequest.ContentType 
        $soapWebRequest.Method      = 'POST' 
        
        $requestStream = $soapWebRequest.GetRequestStream() 
        $SOAPRequest.Save($requestStream) 
        $requestStream.Close() 
        
        $responseStream = $soapWebRequest.GetResponse().GetResponseStream() 
        
        $fileStream =  new-object System.IO.FileStream( $File, [System.IO.FileMode]::Create, [System.IO.FileAccess]::Write )
        $responseStream.CopyTo($fileStream)
        $responseStream.Close()
        $fileStream.Close()

        return $true 
} 


А вот так, выглядят данные которые она обрабатывает

автор
$URL
http://ksb3.zzzzz.ru/webservice/ewebsvc.dll/soap/IewsServer

$Action
urn:webservice-electrasoft-ru:types-ewsServerIntf-IewsServer#Login

$SOAPRequest
<?xml version="1.0" encoding="utf-8"?><SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:ns2="urn:webservice-electrasoft-ru:types-ewsServerIntf" xmlns:ns1="http://www.borland.com/namespaces/Types">
<SOAP-ENV:Body>
<m:Login xmlns:m="urn:webservice-electrasoft-ru:types-ewsServerIntf-IewsServer" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<ConnectionID xsi:type="xs:string"></ConnectionID>
<UserAlias xsi:type="xs:string">Segddatrjgav</UserAlias>
<Password xsi:type="xs:string">fakfjakj123</Password>
<Language xsi:type="xs:string">RU</Language>
<ProfileID xsi:type="xs:string"></ProfileID>
<ContextXML xsi:type="xs:string"></ContextXML>
<Timeout xsi:type="xs:unsignedInt">1800000</Timeout>
</m:Login>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>


Данные просто генерируются сервером. Голым Т-SQL.

ЗЫ. Есть такая БЕСПЛАТНАЯ шняга "Fiddler" - он перехватывает и показывает веб-запроcы/ответы любой (ну почти) программы.
Можно посмотреть и сравнить, если есть работающий пример.

Сообщение было отредактировано: 22 дек 20, 17:13
22 дек 20, 17:18    [22252367]     Ответить | Цитировать Сообщить модератору
 Re: HTTPS over T-SQL  [new]
Двоичник
Member

Откуда: Бобруйск
Сообщений: 330
написал CLR, скопипастил с интернета статейную

+
using System;
using System.Data;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using System.Collections;
using System.Globalization;

// For the SQL Server integration
using Microsoft.SqlServer.Server;

// Other things we need for WebRequest
using System.Net;
using System.Text;
using System.IO;

    public partial class Functions
    {

    // Function to return a web URL as a string value.
    [Microsoft.SqlServer.Server.SqlFunction(DataAccess = DataAccessKind.Read)]
    public static SqlString GET(SqlString uri, SqlString username, SqlString passwd)
    {
        // The SqlPipe is how we send data back to the caller
        SqlPipe pipe = SqlContext.Pipe;
        SqlString document;

        // Set up the request, including authentication
        WebRequest req = WebRequest.Create(Convert.ToString(uri));
        if (Convert.ToString(username) != null & Convert.ToString(username) != "")
        {
            req.Credentials = new NetworkCredential(
                Convert.ToString(username),
                Convert.ToString(passwd));
        }
        ((HttpWebRequest)req).UserAgent = "CLR web client on SQL Server";

        // Fire off the request and retrieve the response.
        // We'll put the response in the string variable "document".
        WebResponse resp = req.GetResponse();
        Stream dataStream = resp.GetResponseStream();
        StreamReader rdr = new StreamReader(dataStream);
        document = (SqlString)rdr.ReadToEnd();

        // Close up everything...
        rdr.Close();
        dataStream.Close();
        resp.Close();

        // .. and return the output to the caller.
        return (document);
    }


    // Function to submit a HTTP POST and return the resulting output.
    [Microsoft.SqlServer.Server.SqlFunction(DataAccess = DataAccessKind.Read)]
        public static SqlString POST(SqlString uri, SqlString postData, SqlString username, SqlString passwd)
        {
            SqlPipe pipe = SqlContext.Pipe;
            SqlString document;
            byte[] postByteArray = Encoding.UTF8.GetBytes(Convert.ToString(postData));

            // Set up the request, including authentication, 
            // method=POST and encoding:
            WebRequest req = WebRequest.Create(Convert.ToString(uri));
            ((HttpWebRequest)req).UserAgent = "CLR web client on SQL Server";
            if (Convert.ToString(username) != null & Convert.ToString(username) != "")
            {
                req.Credentials = new NetworkCredential(
                    Convert.ToString(username),
                    Convert.ToString(passwd));
            }
            req.Method = "POST";
            req.ContentType = "application/x-www-form-urlencoded; charset=utf-8";

            // Submit the POST data
            Stream dataStream = req.GetRequestStream();
            dataStream.Write(postByteArray, 0, postByteArray.Length);
            dataStream.Close();

            // Collect the response, put it in the string variable "document"
            WebResponse resp = req.GetResponse();
            dataStream = resp.GetResponseStream();
            StreamReader rdr = new StreamReader(dataStream);
            document = (SqlString)rdr.ReadToEnd();

            // Close up and return
            rdr.Close();
            dataStream.Close();
            resp.Close();

            return (document);
        }
    }



вызываю
select  dbo.fn_get_webrequest('https://mycompany.ru/HTTPTest?name=Иван&surname=Иванов', 'USER', 'PASS')


получаю хрень:
{ "MSG": "22.12.2020 17:15:46 ������ GET ������ � ���� Srvr=\"SERVERNAME\";Ref=\"SERVICENAME\";.", "surname": "������", "name": "����" }


Как сконвертировать полученный JSON в читабельное чтиво?
Спасибо

К сообщению приложен файл. Размер - 4Kb


Сообщение было отредактировано: 22 дек 20, 17:16
22 дек 20, 17:20    [22252369]     Ответить | Цитировать Сообщить модератору
 Re: HTTPS over T-SQL  [new]
Сон Веры Павловны
Member

Откуда:
Сообщений: 6149
aleks222
Говнокод, который пишут вокруг обертки требует изрядных затрат времени на написание.

Чушь какая. Сгенерить обертки при наличии навыка - дело 2 минут. Если данные после этого надо пулять сразу в базу - ещё пара десятков строк. Это гораздо меньше строк г/кода на T-SQL с ручным составлением/парсингом SOAP, и пишется всё это гораздо быстрее. Сервис типа загрузки в базу курсов валют ЦБ РФ - популярная на этом форуме тема - пишется до рабочего состояния (с ведением логов, оповещением по почте об ошибках) за полчаса. Утверждаю это по факту наличия соответствующего опыта.
aleks222
Не говоря уж о нервах. Когда с этим чудом сталкиваешься, внезапно.

Ну, у всех бывают неприятные ощущения, когда вдруг выясняется, что чего-то не знаешь. Однако это вовсе не говорит о том, что предмет, о котором отсутствуют знания - плохой.
22 дек 20, 17:55    [22252394]     Ответить | Цитировать Сообщить модератору
 Re: HTTPS over T-SQL  [new]
Двоичник
Member

Откуда: Бобруйск
Сообщений: 330
Сон Веры Павловны,

Извините, я вас все же перебью в диспуте. У меня вопрос и как его побороть пока не решил.
Помогите, пожалуйста с проблемой

Спасибо
22 дек 20, 17:57    [22252396]     Ответить | Цитировать Сообщить модератору
 Re: HTTPS over T-SQL  [new]
Двоичник
Member

Откуда: Бобруйск
Сообщений: 330
я уже пробовал
req.ContentType = "application/json; charset=utf-8";
req.ContentType = "application/json; charset=widows-1251";
req.ContentType = "text/xml"

ничего не помогло
22 дек 20, 18:02    [22252403]     Ответить | Цитировать Сообщить модератору
 Re: HTTPS over T-SQL  [new]
env
Member

Откуда: Россия, Москва
Сообщений: 7439
Двоичник,

Посмотрите заголовки ответа, какая там кодировка
22 дек 20, 18:02    [22252405]     Ответить | Цитировать Сообщить модератору
 Re: HTTPS over T-SQL  [new]
Двоичник
Member

Откуда: Бобруйск
Сообщений: 330
Через браузер выполнил. Нет тут ничего

К сообщению приложен файл. Размер - 8Kb
22 дек 20, 18:20    [22252418]     Ответить | Цитировать Сообщить модератору
 Re: HTTPS over T-SQL  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8485
Двоичник,

Если принимаемая строка в UTF-8, то ее надо конвертировать в Unicode. В C# строки юникодовые.
22 дек 20, 20:55    [22252477]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить