|
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); Карлик.Источник.Данные=ТелоЗапр; КодВозврата = Карлик.Выполнить(); Всем спасибо. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |