powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / HTTPS over T-SQL
35 сообщений из 35, показаны все 2 страниц
HTTPS over T-SQL
    #39630935
Фотография hollister
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Коллеги, привет. подскажите пожалуйста, как обращаться к ресурсам HTTPS через T-SQL
Пример кода

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
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 какое то свое хранилище сертификатов?
Прошу помочь

Заранее благодарен.
...
Рейтинг: 0 / 0
HTTPS over T-SQL
    #39630941
Фотография Дедушка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
поиск рулит
...
Рейтинг: 0 / 0
HTTPS over T-SQL
    #39630969
Фотография hollister
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Проблема именно в том, что с этим сайтом код не работает
https://api.direct.yandex.com

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

Что то странное
...
Рейтинг: 0 / 0
HTTPS over T-SQL
    #39630976
Фотография hollister
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Попробуйте у себя рабочий пример

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
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
...
Рейтинг: 0 / 0
HTTPS over T-SQL
    #39631054
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hollister,

С# еще не освоили?
...
Рейтинг: 0 / 0
HTTPS over T-SQL
    #39631470
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владислав Колосовhollister,

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

а смысл?
...
Рейтинг: 0 / 0
HTTPS over T-SQL
    #39631777
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ролг Хупин,

очень простой - закрыть "черный ход" в виде OLE автоматизации.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
HTTPS over T-SQL
    #40029754
Двоичник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что-то не смог победить подключение к веб-сервису

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
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 сервиса

Как понять, почему не авторизовывается ?
Спасибо
...
Рейтинг: 0 / 0
HTTPS over T-SQL
    #40029858
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Двоичник,

так не делают, для взаимодействия с сервисами пишут отдельное приложение-контроллер или, в крайнем случае, CLR функцию.
Это классическая MVC модель.
...
Рейтинг: 0 / 0
HTTPS over T-SQL
    #40030010
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Двоичник
после чего показывает XML сервиса

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

Ну, например, потому, что при basic-авторизации authorization header формируется в виде строки Basic+кодированный в base64 результат конкатенации (через дветочие с пробелом) имени пользователя и пароля. А здесь перевода результата конкатенации в base64 я нигде не наблюдаю.
...
Рейтинг: 0 / 0
HTTPS over T-SQL
    #40030012
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры Павловны
Двоичник
после чего показывает XML сервиса

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


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

Все эти обертки - великое тормозящее зло.
...
Рейтинг: 0 / 0
HTTPS over T-SQL
    #40030024
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aleks222
"Написать письмо" сервису раз в сто проще банальным replace-ом по шаблону.

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

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

Их тормозами можно пренебречь ввиду несоизмеримости задержек самих обёрток, и временем обращения собственно к сервису. В чем состоит остальное "зло"?
...
Рейтинг: 0 / 0
HTTPS over T-SQL
    #40030051
Двоичник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пока вы спорили о прекрасном, мне все же удалось авторизоваться на веб-сервисе. Хотя это вероятно и не правильно, в части шифрованной авторизации, но, так как это будет работать строго в Entranet, то этого достаточно

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
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

Код: sql
1.
Exec sp_OAMethod @Object, 'send', NULL, @postData;



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

Однако в
Код: sql
1.
select http, datalength(http) from @t


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

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

Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
   <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 пока понимания нет и потом получить ответ.
Программист на стороне реализации сервиса утверждает, что авторизацию мою он видит, а вот посылку не видит.

Спасибо за помощь.
...
Рейтинг: 0 / 0
HTTPS over T-SQL
    #40030067
Двоичник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры Павловны
... то следующим шагом была бы ручная сборка SOAP-разметки для вызова методов, описанных в WSDL, причем для каждого метода разметка своя. А потом получение ответного SOAP, и его разбор. ...

Очевидно я тут застрял. Но как сдвинуться дальше, пока не имею представления.
Фактически, программирую с чужих примеров и приемов
...
Рейтинг: 0 / 0
HTTPS over T-SQL
    #40030071
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Двоичник,

бросайте эти игры с OLE и пишите UNSAFE функцию на C#. Но это будет иметь последствия в удобстве сопровождения приложения и менее строгом уровне безопасности базы данных. Лучшее решение - написать отдельный "слой"-контроллер для взаимодействия с веб-сервисом.
...
Рейтинг: 0 / 0
HTTPS over T-SQL
    #40030095
Двоичник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владислав Колосов,

Навыков на C# практически нет. На Delphi малость могу... Но это обещает породить зоопарк в стэке
...
Рейтинг: 0 / 0
HTTPS over T-SQL
    #40030242
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры Павловны
[Их тормозами можно пренебречь ввиду несоизмеримости задержек самих обёрток, и временем обращения собственно к сервису. В чем состоит остальное "зло"?


Все банально.
Говнокод, который пишут вокруг обертки требует изрядных затрат времени на написание.
Не говоря уж о нервах.
Когда с этим чудом сталкиваешься, внезапно.
...
Рейтинг: 0 / 0
HTTPS over T-SQL
    #40030250
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Двоичник
Владислав Колосов,

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


Вот эта хрень на powershell выполняет запрос к SOAP и пишет ответ в файл
Код: powershell
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
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ы/ответы любой (ну почти) программы.
Можно посмотреть и сравнить, если есть работающий пример.
...
Рейтинг: 0 / 0
HTTPS over T-SQL
    #40030252
Двоичник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
написал CLR, скопипастил с интернета статейную

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
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);
        }
    }




вызываю
Код: sql
1.
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 в читабельное чтиво?
Спасибо
...
Рейтинг: 0 / 0
HTTPS over T-SQL
    #40030272
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aleks222
Говнокод, который пишут вокруг обертки требует изрядных затрат времени на написание.

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

Ну, у всех бывают неприятные ощущения, когда вдруг выясняется, что чего-то не знаешь. Однако это вовсе не говорит о том, что предмет, о котором отсутствуют знания - плохой.
...
Рейтинг: 0 / 0
HTTPS over T-SQL
    #40030274
Двоичник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры Павловны,

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

Спасибо
...
Рейтинг: 0 / 0
HTTPS over T-SQL
    #40030279
Двоичник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я уже пробовал
req.ContentType = "application/json; charset=utf-8";
req.ContentType = "application/json; charset=widows-1251";
req.ContentType = "text/xml"

ничего не помогло
...
Рейтинг: 0 / 0
HTTPS over T-SQL
    #40030281
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Двоичник,

Посмотрите заголовки ответа, какая там кодировка
...
Рейтинг: 0 / 0
HTTPS over T-SQL
    #40030285
Двоичник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Через браузер выполнил. Нет тут ничего
...
Рейтинг: 0 / 0
HTTPS over T-SQL
    #40030312
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Двоичник,

Если принимаемая строка в UTF-8, то ее надо конвертировать в Unicode. В C# строки юникодовые.
...
Рейтинг: 0 / 0
HTTPS over T-SQL
    #40030313
andy st
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Двоичник, не очень давно грыз аналогичный кактус через sp_OA...
Закончил тем, что написал CLR процедуры на C#
Сервисы WSDL (как и у Вас). Visual Studio в этом плане очень удобна тем, что по при добавлении ссылки на службу, имеющей такое описание создает полную обвязку методов по коду. Как результат - вызов метода в c# - 2-3 строки. Вход-выход - структуры и типы данных CLR. Кодировки, контроль типов? Чур меня, это к json-щикам.
Обвязка по коду для входных параметров, выходных наборов данных процедур заняла в разы больше места, чем вызов веб-сервисов.
Из тонкостей - если целевой mssql старше 2008R2, то генерить обвязку сервиса в совместимости с framework 2, т.к. в более старших версиях mssql сборки могут быть только управляемые, без нативного кода. А в последних студиях генерится обёртка по умолчанию слегка не попадающая под эти условия.
Пару дней гугла с уровнем знаний в c# чуть > 0
...
Рейтинг: 0 / 0
HTTPS over T-SQL
    #40030339
Двоичник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владислав Колосов

принимаемая строка в UTF-8, то ее надо конвертировать в Unicode.


Не осилил я . Весь вечер просидел в гугле и не нашел решения

прошу помощи, всезнающий алл
...
Рейтинг: 0 / 0
HTTPS over T-SQL
    #40030357
Фотография HandKot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Двоичник
Владислав Колосов

принимаемая строка в UTF-8, то ее надо конвертировать в Unicode.


Не осилил я . Весь вечер просидел в гугле и не нашел решения

прошу помощи, всезнающий алл

Попробуйте изменить
Код: c#
1.
StreamReader rdr = new StreamReader(dataStream, Encoding.UTF8));
...
Рейтинг: 0 / 0
HTTPS over T-SQL
    #40030364
Двоичник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HandKot,

Увы, не помогло...



я чуть перестроил функцию. Но это по наитию. Сказать, что я руководствовался какими-то знаниями, не могу. Так как я C# не знаю от слова совсем.

Сделал так:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
   [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;
        String document;

        // Set up the request, including authentication
        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 = "GET";
        req.ContentType = "application/json; charset=utf-8";        

        // 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, Encoding.UTF8);
        document = (String)rdr.ReadToEnd();

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

        // .. and return the output to the caller.
        return (document+" версия 1");
    }



и при вызове
Код: sql
1.
print cast(dbo.fn_get_webrequest(N'https://mycompany.ru/HTTPTest?name=Иван&surname=Сидоров', 'USER', 'PASS') as nvarchar(500))



я получаю:
SQL{
"MSG": "23.12.2020 9:20:09 ������ GET ������ � ���� Srvr=\"SERVERNAME\";Ref=\"SERVICENAME\";.",
"surname": "�������",
"name": "����"
} версия 1

Код: c#
1.
return (document+" версия 1");


но ведь версия 1 кириллическая!!!!

Значит в CLR уже приходит чушь?
Однако в браузере то все читаемое...




Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
DROP FUNCTION dbo.fn_get_webrequest
GO
DROP FUNCTION dbo.fn_post_webrequest
GO
DROP ASSEMBLY [WebServiceRequestPOST]
GO

CREATE ASSEMBLY WebServiceRequestPOST
FROM 'd:\CLR\WebService\POST\WebServicePOST.dll '
WITH PERMISSION_SET=UNSAFE;
GO


CREATE FUNCTION dbo.fn_get_webrequest(
     @uri        nvarchar(max),
     @user       nvarchar(255)=NULL,
     @passwd     nvarchar(255)=NULL
)
RETURNS nvarchar(max)
AS
EXTERNAL NAME WebServiceRequestPOST.Functions.GET;

GO

CREATE FUNCTION dbo.fn_post_webrequest(
     @uri         nvarchar(max),
     @postdata    nvarchar(max),
     @user        nvarchar(255)=NULL,
     @passwd      nvarchar(255)=NULL
)
RETURNS nvarchar(max)
AS

EXTERNAL NAME WebServiceRequestPOST.Functions.POST;
GO



вроде везде nvarchar , я не понимаю, что я делаю не так.
...
Рейтинг: 0 / 0
HTTPS over T-SQL
    #40030369
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Двоичник,

Возьмите бесплатный postman, сделайте вызов в нём и посмотрите http-заголовки ответа. Там среди прочего должна быть кодировка ответного сообщения. Возможно, вам нужен не Encoding.UTF8, а наоборот Encoding.GetEncoding(1251)
...
Рейтинг: 0 / 0
HTTPS over T-SQL
    #40030370
Двоичник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ожидаю пока, чего программист на стороне веб-сервиса прикрутит. говорит, что он понял в чем проблема.
отпишусь по результату.
в вебсервис приходит кириллица. а в ответ что отдается - мне пока не понятно...
...
Рейтинг: 0 / 0
HTTPS over T-SQL
    #40030373
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Двоичник
вроде везде nvarchar , я не понимаю, что я делаю не так.

MSSQL до 2019-й версии не поддерживает UTF-8 ( nvarchar - это UCS-2 , т.е. UTF-16), поэтому либо костылить перекодировку самому, либо, если сервер 2019-й, поиграться с collation .
Либо, как тут уже не раз писали, перестать есть кактус и, перенести решение этой задачи на другую платформу (CLR SP/внешний сервис).
...
Рейтинг: 0 / 0
HTTPS over T-SQL
    #40030378
Двоичник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры Павловны
Двоичник
вроде везде nvarchar , я не понимаю, что я делаю не так.

MSSQL до 2019-й версии не поддерживает UTF-8 ( nvarchar - это UCS-2 , т.е. UTF-16), поэтому либо костылить перекодировку самому, либо, если сервер 2019-й, поиграться с collation .
Либо, как тут уже не раз писали, перестать есть кактус и, перенести решение этой задачи на другую платформу (CLR SP/внешний сервис).


Если есть возможность почитать мои сообщения выше, то в них именно о том и говорится, что я перевел на CLR. И в настоящее время я бьюсь именно в этом направлении.


В конечном итоге, совместно с разработчиком со стороны веб-сервиса выяснили, что он ранее передавал мне данные в ANSI, а я их читал в UTF-8. После того, как он у себя назначил кодировку UTF-8, то все и заработало как ожидаемо.

Всем спасибо, расходимся
...
Рейтинг: 0 / 0
HTTPS over T-SQL
    #40030382
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Двоичник
он ранее передавал мне данные в ANSI, а я их читал в UTF-8

env
среди прочего должна быть кодировка ответного сообщения. Возможно, вам нужен не Encoding.UTF8, а наоборот Encoding.GetEncoding(1251)
...
Рейтинг: 0 / 0
HTTPS over T-SQL
    #40030697
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Двоичник
Владислав Колосов

принимаемая строка в UTF-8, то ее надо конвертировать в Unicode.


Не осилил я . Весь вечер просидел в гугле и не нашел решения

прошу помощи, всезнающий алл


Когда-то мне было нужно. Фсе это просто и незатейливо.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
ALTER FUNCTION [dbo].[utf16-to-utf8]( @utf16 nvarchar(max) )
RETURNS TABLE 
AS
RETURN 
(
with t as ( select n = 0, b = cast('' as varbinary(max)), c = unicode( substring(@utf16, 1, 1) ) 
            union all
            select n = n + 1
                 , b = b + case when c < 0x80     then cast(c as varbinary(1))
                                when c < 0x800    then cast(((c * 4) & 0xFF00) | (c & 0x3F) | 0xC080 as varbinary(2)) 
                                when c < 0x10000  then cast(((c * 0x10) & 0xFF0000) | ((c * 4) & 0x3F00) | (c & 0x3F) | 0xe08080 as varbinary(3))
                                else                   cast(((c * 0x40) & 0xFF000000) | ((c * 0x10) & 0x3F0000) | ((c * 4) & 0x3F00) | (c & 0x3F) | 0xf0808080 as varbinary(4)) 
                           end
                 , c = unicode( substring(@utf16, n + 2, 1) ) 
              from t where c is not null
          )
    select top(1) utf8 = b from t where c is null
)

ALTER FUNCTION [dbo].[utf8-to-utf16]( @utf8 varbinary(max) )
RETURNS TABLE 
AS
RETURN 
(
with b as ( select b = substring(@utf8, n, 1), n from dbo.N where n between 1 and len(@utf8) )
   , bn as ( select b, n from b where b&128 = 0 or b&224 = 192 or b&240 = 224 or b&248 = 240 )
   , chs as ( select b = case  
                            when b&128 = 0   then      b 
                            when b&224 = 192 then     (b&31) * 64 | ( substring(@utf8, n+1, 1) & 63 ) 
                            when b&240 = 224 then   ( (b&15) * 64 | ( substring(@utf8, n+1, 1) & 63 ) ) * 64 | ( substring(@utf8, n+2, 1) & 63 ) 
                            else                  ( ( (b&07) * 64 | ( substring(@utf8, n+1, 1) & 63 ) ) * 64 | ( substring(@utf8, n+2, 1) & 63 ) ) * 64 | ( substring(@utf8, n+3, 1) & 63 ) 
                         end
                   , n
               from bn
           )
    select utf16 = ( select nchar(b) from chs order by n asc for xml path(''), type ).value('.', 'nvarchar(max)')
)
...
Рейтинг: 0 / 0
35 сообщений из 35, показаны все 2 страниц
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / HTTPS over T-SQL
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]