powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / HTTPS over T-SQL
10 сообщений из 35, страница 2 из 2
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
10 сообщений из 35, страница 2 из 2
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / HTTPS over T-SQL
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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