Имя: Пароль:
1C
1C 7.7
v7: Руский текст с апи мдлп
0 zummer99
 
16.08.21
15:37
Проблема в следующем:
через апи отправляю файл по апи на мдлп.
он принимается
запрашиваю линк на квитанцию. получаю его. по линку получаю квитанцию.
Но где русский текст знаки ??????
Вот код:
    ФайлКвит=СоздатьОбъект("Текст");
    WinHttp = СоздатьОбъект("WinHttp.WinHttpRequest.5.1");    
    WinHttp.Open("GET", "https://api.mdlp.crpt.ru/api/v1/documents/"+ИД_док+"/ticket");
    WinHttp.SetRequestHeader ("Authorization","token "+ токен);
    WinHttp.Send();
    статус=WinHttp.Status;
    Если статус=200 Тогда
        Текст = WinHttp.ResponseText();
        спТекст=глРазборJSON(Текст);
        СсылкаКвит=спТекст.ПолучитьЗначение(1,"спТекст") ;
        WinHttp.Open("GET", СсылкаКвит);
        WinHttp.SetRequestHeader ("Authorization","token "+ токен);
        WinHttp.Send();
        Текст = WinHttp.ResponseText();
        ФайлКвит.ДобавитьСтроку(Текст);
        ФайлКвит.Записать(ВремКаталог+"квит.txt");
    ИначеЕсли статус=401 Тогда
        Сообщить("Устаревший токен, сформируйте новый");
    КонецЕсли;
Например, часть полученной строки с помощью этого кода
       <operation_comment>?§?°N?N???N??????µ ?·?°???µN?N??µ?????µ</operation_comment>
Если тоже самое выполнить в плагине RestMan. Видим туже строку
        <operation_comment>Частичное завершение</operation_comment>

Подскажите, в чем проблема?
1 ДенисЧ
 
16.08.21
15:38
Уникод он такой...
2 zummer99
 
16.08.21
15:42
Так, это решаемо?
3 Guk
 
16.08.21
15:42
(0) дарю...
Функция ПреобразоватьСтрокуИзУТФ8(Стр)
    script = createobject("scriptcontrol");
    script.language = "jscript";
    script.addcode
    (
    "
    |function ToANSI(v)
    |{  
    |v = v.split(""\\u0"").join(""%u0"");
    |return unescape(v) ;
    |}
    |");
    
    возврат script.run("ToANSI", стр);
КонецФункции
4 zummer99
 
16.08.21
16:04
Спасибо
Но не помогло ((((
Вот строка обработанная скриптом
<operation_comment>?§?°N?N???N??????µ ?·?°???µN?N??µ?????µ</operation_comment>
5 zummer99
 
16.08.21
16:04
Т.е. она не изменилась
6 trad
 
16.08.21
16:05
(0) WinHttp.setRequestHeader("Accept-Charset", "windows-1251");
7 zummer99
 
16.08.21
18:00
Это тоже не помогло
Берем в notepad++ пишем Частичное завершение. По умолчанию кодировка UTF-8
Преобразуем в windows-1251 и види젠Частичное завершение
Но у меня принимает ?§?°N?N???N??????µ ?·?°???µN?N??µ?????µ
8 trad
 
16.08.21
19:54
Проверь, в заголовках, какой чарсет сервер возвращает
9 zummer99
 
16.08.21
19:57
Вот начало текста <?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
10 trad
 
16.08.21
20:04
я про http заголовки
11 zummer99
 
16.08.21
20:12
Тогда подскажите где посмотреть
12 dmitryds
 
16.08.21
20:49
(0) А этот файл тоже Вами отправлялся?

ну и еще поставить себе в браузер расширение для rest api и посмотреть что там возвращается
13 zummer99
 
16.08.21
21:41
Если глянуть в мое первое сообщение, то я никаких файлов не отправлял. И там же, RestMan возвращает руские буквы корректно
Что касаемо http заголовков
Если заглянуть в код страницы RestMan, то в начеле видим
<html>
    <head>
        <meta charset="utf-8" />
        <meta name="viewport" content="width=device-width, initial-scale=1.0" />
        <title>RestMan</title>

        <link rel="stylesheet" href="./css/foundation-5.4.6.css" />
        <link rel="stylesheet" href="./css/codemirror-5.3/codemirror.css">
        <link rel="stylesheet" href="./css/codemirror-5.3/monokai.css">
        <link rel="stylesheet" href="./css/ui/expandable.css">
        <link rel="stylesheet" href="./css/ui/history.css">
        <link rel="stylesheet" href="./css/icomoon.css">
        <link rel="stylesheet" href="./css/restman.css">
        <link rel="stylesheet" href="./css/restman-dark.css">
    </head>
Вы про эти заголовки?
14 trad
 
17.08.21
10:54
нет, не про эти
15 Garykom
 
гуру
17.08.21
11:01
тяжко с узкими 1Сниками
16 zummer99
 
17.08.21
11:10
Методичке по правилам общения по апи с мдлп для получения квитанции нужно вып. запрос
Пример из методички:
GET api/v1/documents/97877d07-c949-4e98-9c26-49d9cb4d9fbd/ticket HTTP/1.1
Host: api.sb.mdlp.crpt.ru
Accept: application/json
Authorization: token 13b5b046-0cd7-4e1c-8409-da9541986d1c

И далее ответ ссылка на квитацию
{
"link": "http://api.sb.mdlp.crpt.ru:80/webdav/upload/97877d07-c949-4e98-
9c26-49d9cb4d9fbd/ticket_97877d07-c949-4e98-9c26-49d9cb4d9fbd"
}

По этой ссылке и получаем текст, где русские буквы знаки ???????
17 Garykom
 
гуру
17.08.21
11:14
(16) эта ссылка отдельный от апи вебдав
возможно даже другой сервак
логично что кодировка запросто своя

так сложно выяснить какая кодировка и ее юзать?
18 zummer99
 
17.08.21
11:19
5 сек. Щас поставлю firefox и гляну )))
19 Garykom
 
гуру
17.08.21
11:25
(18) curl лучше поставь
20 Garykom
 
гуру
17.08.21
11:26
(19)+ файрфокс тебе не поможет токен авторизации для скачивания по ссылке указать
21 trad
 
17.08.21
11:43
Чтобы владеть инструментом, надо хотя бы доку по винхттп глянуть и отличать хттп от хтмл
22 zummer99
 
17.08.21
11:48
Request URL: https://api.mdlp.crpt.ru/webdav/upload/4bcd6e8f-1376-4fa8-95fb-acbcd8f5da73/ticket_4bcd6e8f-1376-4fa8-95fb-acbcd8f5da73
Request Method: GET
Status Code: 200 OK
Remote Address: 78.142.221.73:443
Referrer Policy: strict-origin-when-cross-origin
Accept-Ranges: bytes
Connection: keep-alive
Content-Length: 2453
Content-Type: application/octet-stream
Date: Tue, 17 Aug 2021 08:44:39 GMT
ETag: "611b749f-995"
Last-Modified: Tue, 17 Aug 2021 08:34:39 GMT
Server: nginx/1.14.0
Strict-Transport-Security: max-age=15768000
Accept: */*
Accept-Encoding: gzip, deflate, br
Accept-Language: ru,en;q=0.9
Authorization: token 306cc81c..........5e7d41a4a653
Connection: keep-alive
Host: api.mdlp.crpt.ru
sec-ch-ua: " Not;A Brand";v="99", "Yandex";v="91", "Chromium";v="91"
sec-ch-ua-mobile: ?0
Sec-Fetch-Dest: empty
Sec-Fetch-Mode: cors
Sec-Fetch-Site: none
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.164 YaBrowser/21.6.4.694 Yowser/2.5 Safari/537.36
23 zummer99
 
17.08.21
11:48
Кодировка, как я понимаю:
Content-Length: 2453
Content-Type: application/octet-stream
24 zummer99
 
17.08.21
11:49
Или точнее Это
Accept-Encoding: gzip, deflate, br
Accept-Language: ru,en;q=0.9

))))
25 Garykom
 
гуру
17.08.21
11:53
26 Garykom
 
гуру
17.08.21
11:54
У тебя бинарный поток, разбитый на октеты
27 trad
 
17.08.21
12:05
(22) это заголовки запроса
я предлагал глянуть в ответ сервера в (8)
28 zummer99
 
17.08.21
13:34
trad, подскажите как посмотреть
В яндексе смотрю в Инструменте разработчика/Network
Запускаю в рестман выполнение GET и вижу ответ окне Инструмента разработчика. И там только то, что я указал выше
29 zummer99
 
17.08.21
13:45
Если выполнить команду WinHttp.getAllResponseHeaders() //Возвращает строку ответа сервера со всеми заголовками
то видим это
"Connection: keep-aliveDate: Tue, 17 Aug 2021 10:38:02 GMTContent-Length: 2453Content-Type: application/octet-streamLast-Modified: Tue, 17 Aug 2021 08:34:39 GMTAccept-Ranges: bytesETag: "611b749f-995"Server: nginx/1.14.0Strict-Transport-Se"

Тоже самое, что и показано выше

Если выполнить эту команду
WinHttp.responseBody() то Тип переменой не поддерживается

Что еще посмотреть?
30 acht
 
17.08.21
14:00
(0) Преобразуй кодировку через ADODB.Stream. Подробности - в гугле.
31 trad
 
17.08.21
14:39
(29) Да, я ошибся, в (22) действительно заголовки ответа
32 trad
 
17.08.21
15:00
судя по (9) в ответе xml документ
Тогда попробуй так:

    ФайлКвит=СоздатьОбъект("Текст");
    WinHttp = СоздатьОбъект("Msxml2.ServerXMLHTTP");   // !!!!!!! <-- Другой объект
    WinHttp.Open("GET", "https://api.mdlp.crpt.ru/api/v1/documents/"+ИД_док+"/ticket");
    WinHttp.SetRequestHeader ("Authorization","token "+ токен);
    WinHttp.Send();
    статус=WinHttp.Status;
    Если статус=200 Тогда
        Текст = WinHttp.ResponseText();
        спТекст=глРазборJSON(Текст);
        СсылкаКвит=спТекст.ПолучитьЗначение(1,"спТекст") ;
        WinHttp.Open("GET", СсылкаКвит);
        WinHttp.SetRequestHeader ("Authorization","token "+ токен);
        WinHttp.Send();
        статус=WinHttp.Status;
        Если статус=200 Тогда
             ДокXML = Query.responseXML; // тут будет Msxml2.DOMDocument
             ДокXML.save(ВремКаталог+"квит.txt");
        Иначе
            Сообщить("Ошибка " + статус);
        КонецЕсли;
    ИначеЕсли статус=401 Тогда
        Сообщить("Устаревший токен, сформируйте новый");
    Иначе
        Сообщить("Ошибка " + статус);
    КонецЕсли;
33 trad
 
17.08.21
15:01
34 zummer99
 
17.08.21
16:51
trad Спасибо
через Msxml2.ServerXMLHTTP  и с помощью метода ResponseText русские  буквы в строке стали отображаться правильно.
Пробовал создать объект Msxml2.DOMDocument, но с ним ничего не получилось
Где то на форуме взял этот код для перекодировки, т.к. текст возвращается в windows-1251, и документ xml стал открываться.
Вот этот код:
            Байт=255;
            СтримВход=СоздатьОбъект("ADODB.Stream");
            СтримВход.Type=2;
            СтримВход.charset="windows-1251";
            СтримВход.Open();
            СтримВход.LoadFromFile(ВремКаталог+"проба.txt");
            СтримВыход=СоздатьОбъект("ADODB.Stream");
            СтримВыход.Type=2;
            СтримВыход.charset="utf-8";
            СтримВыход.LineSeparator=-1;
            СтримВыход.Open();
            Всего=СтримВход.size;
            Пока СтримВход.EOS=0 Цикл
                СтримВыход.WriteText(СтримВход.ReadText(Байт),?(Байт=-2,1,0));
                Состояние("" + Формат(100 * СтримВход.position/Всего,"Ч(0)5.2")+"%");
            КонецЦикла;
            СтримВыход.SaveToFile(ВремКаталог+"проба.xml",2);
35 trad
 
17.08.21
22:02
(34) домдокумент ведь будет в WinHttp.responseXML без всяких танцев со стрим
2 + 2 = 3.9999999999999999999999999999999...