|   |   | 
| 
 | v7: WB API непонятная кодировка 🠗 (Волшебник 12.03.2025 16:53) | ☑ | ||
|---|---|---|---|---|
| 0
    
        AndreyZ1 13.03.25✎ 19:53 | 
        Коллеги кто знает подскажите - всю голову сломали уже.
 Пробуем понять как работает АПИ ВБ применительно к 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✎ 19:53 | 
        (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);
	Карлик.Источник.Данные=ТелоЗапр;
	КодВозврата = Карлик.Выполнить();Всем спасибо. | |||
| 41
    
        Волшебник 13.03.25✎ 19:54 | 
        (40) Этот код не рабочий, в нём синтаксические ошибки.     | |||
| 42
    
        AndreyZ1 17.03.25✎ 15:51 | 
        РезФайл = "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); Карлик.Источник.Данные=ТелоЗапр; КодВозврата = Карлик.Выполнить(); | |||
| 43
    
        AndreyZ1 17.03.25✎ 15:51 | 
        Так лучше?     | |||
| 44
    
        AndreyZ1 17.03.25✎ 15:53 | 
        А можно еще одну тему создать? или опять мордой по столу возить будете?     | |||
| 45
    
        Волшебник 17.03.25✎ 16:57 | 
        (44) Создайте. Конечно, будем.     | 
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |