Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 7.7 и ранее

v7: Руский текст с апи мдлп

v7: Руский текст с апи мдлп
Я
   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
Уникод он такой...
   zummer99
 
2 - 16.08.21 - 15:42
Так, это решаемо?
   Guk
 
3 - 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", стр);
КонецФункции
   zummer99
 
4 - 16.08.21 - 16:04
Спасибо
Но не помогло ((((
Вот строка обработанная скриптом
<operation_comment>?§?°N?N???N??????µ ?·?°???µN?N??µ?????µ</operation_comment>
   zummer99
 
5 - 16.08.21 - 16:04
Т.е. она не изменилась
   trad
 
6 - 16.08.21 - 16:05
(0) WinHttp.setRequestHeader("Accept-Charset", "windows-1251");
   zummer99
 
7 - 16.08.21 - 18:00
Это тоже не помогло
Берем в notepad++ пишем Частичное завершение. По умолчанию кодировка UTF-8
Преобразуем в windows-1251 и види젠Частичное завершение
Но у меня принимает ?§?°N?N???N??????µ ?·?°???µN?N??µ?????µ
   trad
 
8 - 16.08.21 - 19:54
Проверь, в заголовках, какой чарсет сервер возвращает
   zummer99
 
9 - 16.08.21 - 19:57
Вот начало текста <?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
   trad
 
10 - 16.08.21 - 20:04
я про http заголовки
   zummer99
 
11 - 16.08.21 - 20:12
Тогда подскажите где посмотреть
   dmitryds
 
12 - 16.08.21 - 20:49
(0) А этот файл тоже Вами отправлялся?

ну и еще поставить себе в браузер расширение для rest api и посмотреть что там возвращается
   zummer99
 
13 - 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>
Вы про эти заголовки?
   trad
 
14 - 17.08.21 - 10:54
нет, не про эти
   Garykom
 
15 - 17.08.21 - 11:01
тяжко с узкими 1Сниками
   zummer99
 
16 - 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"
}

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

так сложно выяснить какая кодировка и ее юзать?
   zummer99
 
18 - 17.08.21 - 11:19
5 сек. Щас поставлю firefox и гляну )))
   Garykom
 
19 - 17.08.21 - 11:25
(18) curl лучше поставь
   Garykom
 
20 - 17.08.21 - 11:26
(19)+ файрфокс тебе не поможет токен авторизации для скачивания по ссылке указать
   trad
 
21 - 17.08.21 - 11:43
Чтобы владеть инструментом, надо хотя бы доку по винхттп глянуть и отличать хттп от хтмл
   zummer99
 
22 - 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
   zummer99
 
23 - 17.08.21 - 11:48
Кодировка, как я понимаю:
Content-Length: 2453
Content-Type: application/octet-stream
   zummer99
 
24 - 17.08.21 - 11:49
Или точнее Это 
Accept-Encoding: gzip, deflate, br
Accept-Language: ru,en;q=0.9

))))
   Garykom
 
25 - 17.08.21 - 11:53
   Garykom
 
26 - 17.08.21 - 11:54
У тебя бинарный поток, разбитый на октеты
   trad
 
27 - 17.08.21 - 12:05
(22) это заголовки запроса
я предлагал глянуть в ответ сервера в (8)
   zummer99
 
28 - 17.08.21 - 13:34
trad, подскажите как посмотреть
В яндексе смотрю в Инструменте разработчика/Network
Запускаю в рестман выполнение GET и вижу ответ окне Инструмента разработчика. И там только то, что я указал выше
   zummer99
 
29 - 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() то Тип переменой не поддерживается

Что еще посмотреть?
   acht
 
30 - 17.08.21 - 14:00
(0) Преобразуй кодировку через ADODB.Stream. Подробности - в гугле.
 
 
   trad
 
31 - 17.08.21 - 14:39
(29) Да, я ошибся, в (22) действительно заголовки ответа
   trad
 
32 - 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 Тогда
        Сообщить("Устаревший токен, сформируйте новый");
    Иначе
        Сообщить("Ошибка " + статус);
    КонецЕсли;
   trad
 
33 - 17.08.21 - 15:01
   zummer99
 
34 - 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);
   trad
 
35 - 17.08.21 - 22:02
(34) домдокумент ведь будет в WinHttp.responseXML без всяких танцев со стрим


Список тем форума
 
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.