Имя: Пароль:
1C
1C 7.7
v7: WB API непонятная кодировка
🠗 (Волшебник 12.03.2025 16:53)
0 AndreyZ1
 
11.03.25
15:29
Коллеги кто знает подскажите - всю голову сломали уже.
Пробуем понять как работает АПИ ВБ применительно к 7.7. Тема для нас новая.
Отправляем запрос для получения списка товара и на выходе получаем ответ json c неправильной кодировкой кириллицы.
Пример запроса:
Функция WinHttp(Type, URL, Data="") // Type = "GET" или "POST"  
    
    WinHttp.Open("POST","https://content-api.wildberries.ru/content/v2/get/cards/list" ,0);  
    WinHttp.SetRequestHeader("locale", "ru");
    WinHttp.setRequestHeader("Authorization", "eyJh- токен-Duw");
    
    Data = "{ ""settings"": { ""cursor"": {""limit"": 100 },""filter"": {""withPhoto"": -1}}}";
    WinHttp.Send(Data);
    
    Если WinHttp.Status = 200 Тогда
        Возврат WinHttp.ResponseText;  
        Сообщить(WinHttp.ResponseText);
    Иначе
        Сообщить(WinHttp.ResponseText);
        Возврат 0;
    КонецЕсли;    
    
КонецФункции  

Ответ приходит вот такой (Пример поля title):
<title>??N?N? N?????N????�??N??? Sabah 69% 350??</title>

Латиница нормально а кириллица нет.
Кто знает как правильно сделать запрос.
1 Kigo_Kigo
 
11.03.25
15:35
не реклама
«Шти́рлиц» — бесплатная утилита с закрытым исходным кодом, которая способна расшифровывать практически любые тексты, написанные в различных кодировках, транслитерации, а также отобразить двоичные данные, зашифрованные в текстовой форме или тексты, которые подверглись смешанному перекодированию.
2 Злопчинский
 
11.03.25
15:35
ну дык ответ вы где смотрите?
3 Kigo_Kigo
 
11.03.25
15:38
Скорее всего приходит UTF-8
4 MWWRuza
 
гуру
11.03.25
16:14
Сталкивался я с подобным, когда ЭДО ковырял.
Так и не смог добиться возврата правильной кодировки в теле ответа запроса HTTP. Сделал через "карлика" и получение ответа в виде временного файла, после чего, открытие и удаление лишнего. Так - работает нормально.
А заголовками запроса, сколько не играл - все равно не верно возвращает.

(3) Скорее всего приходит UTF-8
Да. Но, реально данные там в 1251. И сколько не задавай параметры в заголовек, текст уродуется - получается как-бы в утф-8, а реально там 1251, и в результате ни так ни так не читается. Ставишь в заголовок Accept-Charset Win1251 - вообще кракозябры. Это вроде со СБИС у меня так было, сейчас не найду тему на вскидку, но, тут была.

PS Тут, начиная с сообщения 25: Падает "карлик" при выводе результата...
5 AndreyZ1
 
11.03.25
16:05
Да чем только не пробовали-). Догадываемся что UTF-8 скорее всего. Но ни водпадом ни тем-же например просмотрщиком от тоталкомандера не открывается. Пробовали altowa -й открывать как json. Собственно говоря оттуда и пример. Таже херня. Штирлиц тоже не помог. Какой-то есть ньюанс, но какой. -)
7 AndreyZ1
 
11.03.25
16:07
Вот варианты которые пробовались в запросе: -)
//WinHttp.Option(2,"utf-8");
//WinHttp.SetRequestHeader("Accept-Language", "ru");
//    WinHttp.SetRequestHeader("Accept-Charset","utf-8");
//    WinHttp.SetRequestHeader("Accept-Encoding", "identity");
// WinHttp.SetRequestHeader("Accept-Charset","utf-8");                                                  
//  WinHttp.setRequestHeader("Content-Charset", "utf-8");    
// WinHttp.setRequestHeader("Content-Language", "ru");  
//{""withPhoto"": -1}  
//WinHttp.setRequestHeader("Accept-Charset", "utf-8");
//WinHttp.setRequestHeader("Content-Type", "application/json;charset=utf-8");  
//WinHttp.setRequestHeader("Content-Type", "application/json");
8 Kigo_Kigo
 
11.03.25
16:12
.setRequestHeader("Content-type", "application/xml; charset=utf-8");
а может прокатит?
WinHttp.setRequestHeader("Content-Type", "application/json;charset=utf-8");  
и этот и перекодировка
а ответ всегда одинаков при установке заголовка?
9 AndreyZ1
 
11.03.25
16:15
(6) Делали. Не помогло.
10 AndreyZ1
 
11.03.25
16:20
(8) WinHttp.setRequestHeader("Content-type", "application/xml; charset=utf-8");
Не не прокатило.
WinHttp.setRequestHeader("Content-Type", "application/json;charset=utf-8"); пробовали до этого - нет.
|а ответ всегда одинаков при установке заголовка?
да ответ всегда одинаков..
11 AndreyZ1
 
11.03.25
16:21
А чем еще можно моздать нттр запрос в 7.7 кроме метода WinHttp?
12 arsik
 
гуру
11.03.25
16:30
(10) Ну и? Он у тебя возвращает строку в УТФ, а 77 не может УТФ читать. Тебе полученную строку нужно например через WinHttp сохранить, а потом преобразовать в нужную кодировку, тоже сторонним инструментом.
(11) Один из вариантов - веб прослойка на чем ни будь простом - php. Принимает запросы в любой кодировке и транслирует его дальше, а ответ в нужной кодировке возвращает.
Ну или поищи curl1c.dll - он вроде должен работать
13 Kigo_Kigo
 
11.03.25
16:44
попробуйте в КУРЛ онлайн запихнуть свой запрос и посмотрите ответ
14 AndreyZ1
 
11.03.25
16:34
(12)     URLAPI = "https://content-api.wildberries.ru/content/v2/object/all";
    текРезультатСоединения = WinHttp("GET", URLAPI);
    тхт = СоздатьОбъект("Текст");
    тхт.ДобавитьСтроку(текРезультатСоединения);
    тхт.Записать("e:\out.txt");

Пример текста из out.txt (открыт вордпадом):
{"cards":[{"nmID":349695993,"imtID":334892924,"nmUUID":"01956b94-411b-73db-acef-9cae719c51d1","subjectID":5266,"subjectName":"?????»?±?°N?N?","vendorCode":"00016284","brand":"","title":"??N??°?·??????N??????µ N?????N??µ?????µ ?? N?N?N??????? ???µ????N??µ, ?????µ?¶?°???°","
15 AndreyZ1
 
11.03.25
16:50
Спасибо ща будем в сторону курла копать
24 Злопчинский
 
11.03.25
18:50
(12) ну так я блин еще в самом начале спросил ГДЕ он смотрит.
Если приходит как утф8 - тупо формексом декодировать из утф8 в 1251, встроенный метод есть в Сервисе
31 Djelf
 
11.03.25
22:20
Это видимо кодировка json, там примерно так закодировано https://www.opennet.ru/base/dev/perl_json.txt.html
Декодеров для 7.7, насколько я помню, нет, разве что в 1sqlite это работает, в модуле https://www.sqlite.org/json1.html
Работает странно, декодирует только финальные значения, а вот групповые срезы в json_each() и json_tree() не декодирует, возможно так и задумано.
Финальные декодирует, ну и хорошо, вот этим и пользуюсь.
32 MWWRuza
 
гуру
12.03.25
00:02
Я в (4) вот про это:

Карлик.Приемник.Тип = 0 - строка, 1 - файл
Карлик.Приемник.Данные = значение строки, имя файла

Делать сразу: Карлик.Приемник.Тип = 1

Тогда в файл, по пути указанном тут: Карлик.Приемник.Данные = <путь к временному файлу> копируется файл с сервера в готовом виде, а не строка ответа. Его уже потом можно открыть и если нужно перекодировать.
Попробуйте, возможно поможет.
33 BalBess
 
12.03.25
09:20
(11) попробуй через Microsoft.XMLHTTP
т.е. не через WinHttp.WinHttpRequest.5.1
С озоном было подобное
34 MWWRuza
 
гуру
12.03.25
09:29
Да, (33) Иногда помогает. Именно в ответах строкой, там кодировка правильно работает.
А в (4) я вспомнил, что конклетно было... Там немного не так. Там возвращался XML, в заголовке которого прописано 1251, а он внутри UTF-8 прилетал. Поэтому парсился не корректно. Вот там это помогает. Тут, возможно другое, но похожее.
35 Arbuz
 
12.03.25
15:42
(14) Объект текст работать не будет. 7.7 умеет только в однобайтную кодировку. Либо костыли для двоичных данных, либо перекодировать до получения в текст (опять же символов за пределами 1251 не получишь), либо сразу сохранять во внешний файл, как уже сказали.
36 trad
 
12.03.25
15:50
(7) почему utf-8? тогда как тебе в семерке нужно получить windows-1251
Accept... - это про то как ты просишь сервер тебе вернуть
37 trad
 
12.03.25
15:50
setRequestHeader("Accept", "application/json");
setRequestHeader("Accept-Charset", "windows-1251");

Но не факт, конечно, что сервер заморачивается возвратом в запрашиваемой кодировке
38 trad
 
12.03.25
15:54
(8) (10) Content-Type - это про то что ты серверу передаешь (если передаешь что-то в теле)

например
setRequestHeader("Content-Type", "application/json; charset=windows-1251");
39 Волшебник
 
12.03.25
16:54
Да хватит метать бисер перед свиньями!
40 AndreyZ1
 
13.03.25
17:22
(37) Пробовали. "сервер не заморачивается .. " -)
Вообщем взлетело на курле. Вот рабочий код если кому пригодится применительно к WB. В данном случае запрос списка карточек товаров с характеристиками.
    РезФайл = "e:\out.txt" ;
    АдресЗапроса = "https://content-api.wildberries.ru/content/v2/get/cards/list";
    ТелоЗапр = "{ ""settings"": { ""cursor"": {""limit"": 100 },""filter"": {""withPhoto"": -1}}}";  
    Authorization = "--токен--";
    ЗагрузитьВнешнююКомпоненту("curl1c.dll");
    Карлик = СоздатьОбъект("Карлик");
    Приемник = Карлик.Приемник;
    Приемник.Тип = 1;    //Файл
    Приемник.Данные =РезФайл;
    Карлик.УстановитьПараметр("URL",АдресЗапроса);
    Карлик.УстановитьПараметр("CUSTOMREQUEST","POST");
    Карлик.УстановитьПараметр("HTTPHEADER", "Content-Type" + ":"+ "application/xml;charset=UTF-8");  
    Карлик.УстановитьПараметр("HTTPHEADER", "Authorization" + ":"+Authorization);
    Карлик.Источник.Данные=ТелоЗапр;
    КодВозврата = Карлик.Выполнить();
Всем спасибо.
Проблемы невозможно решaть нa том же уровне компетентности, нa котором они возникaют. Альберт Эйнштейн