Прочитать ответ от Kafka

1. wbazil 140 15.11.22 19:33 Сейчас в теме
Получаю от Kafka json
[
{
"topic": "AWIS3_CatalogSettlements",
"key": "AAAAA89IMGU1ZjBjYjYtNGIzYS0xMWU0LWFiNmQtMDA1MDU2ODAxMzI5",
"value": "AAAAA9BIMGU1ZjBjYjYtNGIzYS0xMWU0LWFiNmQtMDA1MDU2ODAxMzI5CjE­5Mjg0INCe0YHRgtGA0ZbQudC60LhIYmZkZmFhYjUtNzRjZS00ZTRjLTk3ZWY­tYzRlZjNjY2NjOGNhAEhlNGFiMTU3MC00YjMzLTExZTQtYWI2ZC0wMDUwNTY­4MDEzMjlINTYzY2VkMTMtZjIxMC0xMWUzLThjNGEtMDA1MDU2ODAwMmNmJDQ­5LjgxMjM4ODAwMDAwMDAwMCQzMC4zMTU2ODgwMDAwMDAwMDBIODU1ZTU0OTg­tNTQ0NS0xMWVkLWEzNjEtNDhkZjM3YjkyMDk2SDAwMDAwMDAwLTAwMDAtMDA­wMC0wMDAwLTAwMDAwMDAwMDAwMAAA",
"partition": 0,
"offset": 33009
}
]

Передаю значение "value" как строка Строка64 в код

ДвДанные = Base64Значение(Строка64);
ЧтениеДвДанных = Новый ЧтениеДанных(ДвДанные);
ДекодированнаяСтрока = ЧтениеДвДанных.ПрочитатьСимволы();
ЧтениеДвДанных.Закрыть();

в ДекодированнаяСтрока получаю ответ

�H
0e5f0cb6-4b3a-11e4-ab6d-00505680132919284
Острійки
H
bfdfaab5-74ce-4e4c-97ef-c4ef3cccc8ca
H
e4ab1570-4b33-11e4-ab6d-005056801329
H
563ced13-f210-11e3-8c4a-0050568002cf$
49.812388000000000$30.315688000000000
H
855e5498-5445-11ed-a361-48df37b92096
H
00000000-0000-0000-0000-000000000000

как видим данные читаются есть название населенного пункта(Острійки), есть координаты(49.812388000000000$30.315688000000000), и какие то GUID все это разделено символом "H"

Вопрос как заставить платформу прочитать эти данные в более нормальном(читабельном) виде?
По теме из базы знаний
Вознаграждение за ответ
Показать полностью
Найденные решения
37. wbazil 140 16.01.23 12:27 Сейчас в теме +12 $m
в данном случаи было несколько ошибок постараюсь кратко описать
1. формат при создании подписчика binary работал по первоначально переданной ссылке, а для работы с avro надо было использовать ссылку которая возвращается при при создании подписчика
2. при получении данных надо передать в заголовках
Accept application/vnd.kafka.avro.v2+json
Content-Type application/vnd.kafka.avro.v2+json

после этих исправлений удалось данные корректно получить в json
всем спасибо кто принимал участие
user5300; +1 Ответить
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
11. spacecraft 15.11.22 21:30 Сейчас в теме
(1)
Вопрос как заставить платформу прочитать эти данные в более нормальном(читабельном) виде?

А платформа об этом знает? Сомневаюсь.
А гуиды вполне возможно идентификаторы самой системы кафки. Посмотрите документацию. Возможно по ним можно получить подробное описание.
Ну и соответственно составлять таблицу соответствий этих гуид и своих объектов в базе.
12. wbazil 140 16.11.22 09:52 Сейчас в теме
(11) сначала хочется получить как то вменяемо эти данные, т.е. в какой то универсальной коллекции
13. user856012 14 16.11.22 10:14 Сейчас в теме
(12)
в какой то универсальной коллекции
Массив подойдет в качестве "универсальной коллекции"? Если да, то вам его создаст СтрРазделить() с символом "H" в качестве разделителя.

Или "H$", тогда и координаты тоже сразу станут отдельными элементами массива.
3. wbazil 140 15.11.22 19:54 Сейчас в теме
конечно видел эту статью, ответа на свой вопрос не нашел
4. user1203706 15 15.11.22 20:18 Сейчас в теме
(3) а так что хоть ?

ДекодированнаяСтрока = ЧтениеДвДанных.ПрочитатьСтроку();
5. user1203706 15 15.11.22 20:20 Сейчас в теме
Ну или так

ДекодированнаяСтрока  = ПолучитьСтрокуИзДвоичныхДанных(Base64Значение(Строка64));
6. user1203706 15 15.11.22 20:20 Сейчас в теме
Да и.. точно на выходе нужно строку иметь.. ? а не коллекцию какую-нить чего-нибудь
7. wbazil 140 15.11.22 20:22 Сейчас в теме
на выходе все что угодно что бы прочитать нормально
8. svilsa 13 15.11.22 20:42 Сейчас в теме +1 $m
Нет, не то
Может покопать в этом направлении: просто когда наоборот 1С должна отдавать, то работает такой код, а тут надо наоборот
codeVerifier = ГенерацияСлучайногоНабораСимволов48(ТекущаяУниверсальнаяДатаВМиллисекундах());
    //КонецЕсли;
    //Если Не ЗначениеЗаполнено(codeChallenge) Тогда 
    Хэш = Новый ХешированиеДанных(ХешФункция.SHA256);
    Хэш.Добавить(codeVerifier);
        
    СтрокаBase64 = Base64Строка(Хэш.ХешСумма);
    СтрокаBase64 = СтрЗаменить(СтрокаBase64, "=", "");
    СтрокаBase64 = СтрЗаменить(СтрокаBase64, "+", "-");
    СтрокаBase64 = СтрЗаменить(СтрокаBase64, "/", "_");
        
    codeChallenge = СтрокаBase64;
    //КонецЕсли;

Показать
9. wbazil 140 15.11.22 20:55 Сейчас в теме
(4) (5) возвращают то же что и (1)
"�H
0e5f...."

при десерелизации масив соответствий значение value остается строкой
Прикрепленные файлы:
10. wbazil 140 15.11.22 21:03 Сейчас в теме
вот тоже не дает покоя что key что value начинаются с ААААА это какой то объект, но отправляющая сторона говорит все сделано по доке
https://docs.confluent.io/platform/current/tutorials/examples/clients/docs/rest-proxy.html
......
по доке я данные и получил, а как достать ...... как в той присказке "видит глаз да зуб неймет"
22. user5300 1077 16.11.22 11:13 Сейчас в теме +1 $m
(10)
отправляющая сторона говорит все сделано по доке

отправляющая сторона в каком формате отправляет вам?
Запросите пример отправки
23. wbazil 140 16.11.22 11:36 Сейчас в теме
24. SlavaKron 16.11.22 12:08 Сейчас в теме +1 $m
(10)
не дает покоя что key что value начинаются с ААААА
Это нулевые байты.
Один символ Base64 кодирует 6 бит данных. "A" это по сути 000000 в двоичной системе.
Символы64: ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz01234567­89+/
14. wbazil 140 16.11.22 10:17 Сейчас в теме
это решение я понимаю, вижу риски тут если
в начале какие то непонятные байты "�H
если в какой то момент разделителем "станет" другой символ, или этот символ попадет в значения вложениях данных СтрРазделить вернет не верные данные
15. user856012 14 16.11.22 10:29 Сейчас в теме
(14)
в начале какие то непонятные байты "�H
Ну, это просто - первый элемент массива отбрасываем, в нем будет только "�"
если в какой то момент разделителем "станет" другой символ
Тогда надо будет генерировать сообщение об ошибке вида "Пригласите программиста!". :-)

ИМХО, в программировании не надо пытаться предусмотреть то, чего нет и, возможно, никогда не будет, надо писать программу для тех условий, что есть сейчас.
или этот символ попадет в значения вложениях данных
А вот это теоретически возможно. Но не в GUID, их формат определен, а в название населенного пункта - если оно будет начинаться с большой латинской "H". Может ли такое быть в вашей задаче - я не знаю.
16. wbazil 140 16.11.22 10:36 Сейчас в теме
(15)
с большой латинской "H". Может ли такое быть в вашей задаче - я не знаю.

в том то и дело что может это ж только маленький пример для теста, там около 80+ topic по 5 из которых планируется интеграция а дальше если взлетит больше
18. Sashares 33 16.11.22 10:45 Сейчас в теме
(16)Ну не используйте СтрРазделить.
Элементарная же обработка - берете первую строку, какой в ней символ есть, тот и разделитель.
Дальше просто в цикле построчно читаете данные.
Если строка формата ГУИДа, это ГУИД, иначе это координаты или название пункта.
В чем у вас сложность, не понимаю.
user856012; +1 Ответить
19. user856012 14 16.11.22 10:51 Сейчас в теме
(16)
в том то и дело что может это ж только маленький пример для теста
А, кстати, вы этот пример привели as is, или отредактировали?

То есть, декодированные данные исходно содержат символы перевода строки или это вы их туда добавили для удобства чтения?

Если содержит, то можно разделять строку в массив по Символы.ПС, а дальше в цикле проверять элементы массива:
1. Если СтрДлина(ЭлементМассива)<=2 (на всякий случай) - это разделитель (любой символ!), пропускаем.
2. Если Сред(ЭлементМассива,9)="-" И Сред(ЭлементМассива,14)="-" И Сред(ЭлементМассива,19)="-" И Сред(ЭлементМассива,24)="-" и Найти(ЭлементМассива,"$")>0 - это GUID+координаты, разлагаем элемент по "$"
3. Если Сред(ЭлементМассива,9)="-" И Сред(ЭлементМассива,14)="-" ИСред(ЭлементМассива,19)="-" ИСред(ЭлементМассива,24)="-" - это GUID.
4. Иначе - это населенный пункт.
20. wbazil 140 16.11.22 10:55 Сейчас в теме
(19)
А, кстати, вы этот пример привели as is, или отредактировали?

перевод строки добавил я что бы картинку не прикреплять
21. user856012 14 16.11.22 11:04 Сейчас в теме
(20)
перевод строки добавил я
Жаль. Ну, тогда вам отличную идею подал Sashares: перебираем строку посимвольно, как только нашли символ с кодом в диапазоне от 48 до 255 - это разделитель, по нему разлагаем в массив.
17. spacecraft 16.11.22 10:43 Сейчас в теме
(14)
в начале какие то непонятные байты "�H

Это (�) вполне может быть байт указания символа разделителя. В данном случае символом указан H.
Т.е. вполне можно узнать символ разделитель и разделить по нему.
25. wbazil 140 16.11.22 13:15 Сейчас в теме
пока копаю в сторону создания потребителя попробовать вместо binary передать avro
26. user5300 1077 16.11.22 13:51 Сейчас в теме
(25) Скинули пример? покажите?
27. wbazil 140 16.11.22 13:55 Сейчас в теме
пока нет, жду
это огромная структура, даже не дают контакты человека с которым можно поговорить, все через менеджеров как с их так и с нашей стороны, ничего нового, как всегда 1с копает
28. viplelik 35 17.11.22 05:16 Сейчас в теме +1 $m
Вот такой мой вариант. Ищем все GUID в строке. Все найденные GUID сохраняем в массиве.
Далее уже от них ищем индекс и город.
Широту и долготу по ищем по "$"
СтроковыеФункцииКлиентСервер.ЭтоУникальныйИдентификатор это БСП функция. Показывать здесь её не буду, сможете посмотреть у себя.

ДекодированнаяСтрока = ПолучитьСтрокуИзДвоичныхДанных(Base64Значение(Base64Text));
    МассивGUID = Новый Массив;
    
    Для Индекс = 1 По СтрДлина(ДекодированнаяСтрока) Цикл
        GUID = Сред(ДекодированнаяСтрока, Индекс, 36);
        
        Если СтроковыеФункцииКлиентСервер.ЭтоУникальныйИдентификатор(GUID) Тогда
            МассивGUID.Добавить(GUID);
        КонецЕсли;
    КонецЦикла;

    Если МассивGUID.Количество() > 0 Тогда
        ПозицияГородаСИндексомНачало = СтрНайти(ДекодированнаяСтрока, МассивGUID[0])+36;
        ПозицияГородаСИндексомКонец = СтрНайти(ДекодированнаяСтрока, МассивGUID[1])-1;
        ИндексИГород = СокрЛП(Сред(ДекодированнаяСтрока, ПозицияГородаСИндексомНачало, ПозицияГородаСИндексомКонец-ПозицияГородаСИндексомНачало));
    КонецЕсли;
    
    ПозицияШирота = СтрНайти(ДекодированнаяСтрока, "$")+1;
    ПозицияДолгота = СтрНайти(ДекодированнаяСтрока, "$",,ПозицияШирота)+1;
    
    Широта = Сред(ДекодированнаяСтрока, ПозицияШирота, 18);
    Долгота = Сред(ДекодированнаяСтрока, ПозицияДолгота, 18);
    

Показать
29. wbazil 140 17.11.22 09:28 Сейчас в теме
(28) спасибо за Ваш алгоритм, вчера презентовал что то подобное на дейли, где присутствовал и архитектор.
приняли решение что схема рабочая, но пока будем искать другое решение
отправили запрос в компанию вледелец сервиса, посмотрим что ответят
30. user856012 14 17.11.22 09:42 Сейчас в теме
(29)
пока будем искать другое решение
Даже интересно - чем не устраивает ни одно из предложенных? Тем, что "однажды внезапно все может поменяться"? Ну, тогда для решения задачи нужен ИИ (искусственный интеллект), который будет понимать содержимое строки.

Или волшебное заклинание: "Сим-салабим-ахалай-махалай!" - и строка сама разложилась так, как нужно!

Кроме сложностей с практической реализацией этих двух методов есть еще один маааленький нюанс: оба стоят несколько больше, чем 10 $m. ;-)
31. wbazil 140 17.11.22 10:28 Сейчас в теме
(30)
больше, чем 10 $m

конечно если искать решение то так, я писал вопрос в надежде что у кого то уже был подобный опыт с кафкой, и когда найду решение обязательно его тут опубликую
как написал user5300 тут надо ещё понять что отдающая сторона ложит в бейс64, что бы корректно прочитать
жду ответа от владельца сервиса
32. user1326147 17.11.22 11:11 Сейчас в теме
(31)Платформа тут причем? Это я так понимаю закодированные гео данные. Расшифровываются через запрос к сервису новой почты ua.
params = {
                "modelName": "AddressGeneral",
    "calledMethod": "getSettlements",
    "methodProperties": {
        "AreaRef": "dcaadb64-4b33-11e4-ab6d-005056801329",
        "Ref": "0e451e40-4b3a-11e4-ab6d-005056801329",
        "RegionRef": "e4b03a8f-4b33-11e4-ab6d-005056801329",
        "Page": "1",
        "Warehouse": "1"
    },
    "apiKey": "Мой_ключ-3b4674-"
        };
Показать
36. user856012 14 17.11.22 12:59 Сейчас в теме
(31)
надо ещё понять что отдающая сторона ложит в бейс64, что бы корректно прочитать
А данные в (1) откуда взялись? С межэтажного перекрытия? :-)
жду ответа от владельца сервиса
Может, ветку следовало создавать после этого?

А то получается задачка почти как в сказке: "Прочитай то - не знаю что, раскодируй туда - не знаю куда".
33. wbazil 140 17.11.22 11:46 Сейчас в теме
(32) я не с апи получаю данные, а с кафки через REST Proxy: Example for Apache Kafka, пока так стоит задача.
34. user1326147 17.11.22 11:59 Сейчас в теме
(33) Нужно просто строку разделить по "H"?
35. wbazil 140 17.11.22 12:58 Сейчас в теме
(34) нет, надо значение value преобразовать в коллекцию 1с, другим способом, без разделения по Н
37. wbazil 140 16.01.23 12:27 Сейчас в теме +12 $m
в данном случаи было несколько ошибок постараюсь кратко описать
1. формат при создании подписчика binary работал по первоначально переданной ссылке, а для работы с avro надо было использовать ссылку которая возвращается при при создании подписчика
2. при получении данных надо передать в заголовках
Accept application/vnd.kafka.avro.v2+json
Content-Type application/vnd.kafka.avro.v2+json

после этих исправлений удалось данные корректно получить в json
всем спасибо кто принимал участие
user5300; +1 Ответить
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот