libcurl for Clarion

Модератор: Дед Пахом

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Аватара пользователя
RaFaeL
✯ Ветеран ✯
Сообщения: 1376
Зарегистрирован: 24 Март 2009, 17:59
Откуда: НН
Благодарил (а): 7 раз
Поблагодарили: 1 раз
Контактная информация:

libcurl for Clarion

Сообщение RaFaeL »

FromJSON работает элементарно. Вам надо создать группу из трех полей: status (long), messages (string,DIM(10)), resp (string, DIM(сколько у вас возвращается я не знаю)). Дальше FromJSON(текст, группа), собственно вроде всё. Какие-то настройки при декодировании не обязательны. Но я с массивами стараюсь не работать, в основном через очереди, но там надо в 2 прохода
Аватара пользователя
Alex
Старожил
Сообщения: 210
Зарегистрирован: 29 Август 2005, 14:54
Откуда: Белоруссия

libcurl for Clarion

Сообщение Alex »

Спасибо за советы. Пробую .
P.S. resp (string, DIM(XX))
XX априори конечно неизвестен
После FromJSON(текст, группа) в группе поля пусты. хм.
Spoiler
JSONGroup Group,PRE(JGR)
status long
messages string(20),DIM(10)
resp string(100),DIM(10000)
end
.....................
IF LEN(CLIP(JSONstring)) > 0
JSON.FromJSON(LocString, JSONGroup)
END
Странно.
LocString &= NEW(STRING(LEN(CLIP(JSONstring))))
Неужели создается нулевой длины. Да. Нашел ошибку. Теперь в LocString значение JSONString присваивается. Но после вызова JSON.FromJSON(LocString, JSONGroup)
Поля JSONGroup пусты.
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3131
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 10 раз
Поблагодарили: 28 раз
Контактная информация:

libcurl for Clarion

Сообщение Дед Пахом »

Пользовался cJSON и jFiles, предпочитаю cJSON.
С уважением, ДП
Аватара пользователя
RaFaeL
✯ Ветеран ✯
Сообщения: 1376
Зарегистрирован: 24 Март 2009, 17:59
Откуда: НН
Благодарил (а): 7 раз
Поблагодарили: 1 раз
Контактная информация:

libcurl for Clarion

Сообщение RaFaeL »

Alex писал(а): 23 Март 2021, 15:19 Поля JSONGroup пусты.
Префикс не надо у группы. Либо делайте у полей атрибут NAME
Аватара пользователя
Alex
Старожил
Сообщения: 210
Зарегистрирован: 29 Август 2005, 14:54
Откуда: Белоруссия

libcurl for Clarion

Сообщение Alex »

Префикс у группы убрал. Полям JSONGroup.resp значения не присваиваются.
Spoiler
SendRequest ROUTINE
DATA
curl TCurlHttpClass
res CURLcode
qIndex LONG, AUTO
respBuffer &IDynStr

JSONGroup Group ! описание группы для приема данных из строки JSON
status long
messages string(20),DIM(10)
resp string(100),DIM(10000)
end


JSON JSONDataClass

LocString &STRING
CODE
!==================================
! Операторы CURL для получения строки JSON с массивом данных
!==================================
respBufferLen#= LEN(CLIP(respBuffer.Str()))
!===========================================================
! где respBuffer.Str() - ф-ция Libcurl, возвращает JSON строку с ответом
! Проверено . Строка содержит ответ.
!===========================================================
LocString &= NEW(STRING(respBufferLen#))
! Debug('JSONstring '& JSONstring[1:100])
! Debug('respBufferLen '& respBufferLen#)
LocString =respBuffer.Str()
!===================================================
! Проверено. В LocString присвоена строка
!===================================================
IF LEN(CLIP(LocString)) > 0
JSON.FromJson(LocString, JSONGroup)
END
Как я понимаю , поскольку JSON строка это одномерный массив, то в поле группы
resp string(100),DIM(10000)
эта JSON строка должна разместиться. Где 100- макс.длина элемента JSON массива. Где 10000 - максимальное значение элементов в JSON массиве.
Или я неправильно истолковал идеологию?
Аватара пользователя
RaFaeL
✯ Ветеран ✯
Сообщения: 1376
Зарегистрирован: 24 Март 2009, 17:59
Откуда: НН
Благодарил (а): 7 раз
Поблагодарили: 1 раз
Контактная информация:

libcurl for Clarion

Сообщение RaFaeL »

Все верно. Я проверил, все присваивается (правда, кавычки не убирает, хотя вроде должен). Но у меня немного переписанный JSONDataClass, попробуйте
Вложения
JSON.ZIP
(13.86 КБ) 167 скачиваний
Аватара пользователя
Alex
Старожил
Сообщения: 210
Зарегистрирован: 29 Август 2005, 14:54
Откуда: Белоруссия

libcurl for Clarion

Сообщение Alex »

Для FromJSON в случае массива , в котором значения одного поля- список брэндов структура группы и очереди
Spoiler
Brandsgroup GROUP
Name STRING(100)
END
BrandsQueue Queue(Brandsgroup)
END
Тогда JSON.FromJson(LocString, BrandsQueue) формирует очередь брэндов (без кавычек кстати)
Значения в Esc кодировке остаются как были
"\u042f\u0428\u041a\u0418\u041d\u041e","\u042f\u0428\u0424"
выполнение
LocString = JSON.UnEscapeString(LocString)
не приводит к преобразованию в символы.
Аватара пользователя
RaFaeL
✯ Ветеран ✯
Сообщения: 1376
Зарегистрирован: 24 Март 2009, 17:59
Откуда: НН
Благодарил (а): 7 раз
Поблагодарили: 1 раз
Контактная информация:

libcurl for Clarion

Сообщение RaFaeL »

Alex писал(а): 24 Март 2021, 17:53 Значения в Esc кодировке остаются как были
Тут https://forum.clarionlife.net/viewtopic ... 296#p44296 я выкладывал функцию для декодирования. Это уже за рамками преобразования из собственно JSON
Аватара пользователя
Alex
Старожил
Сообщения: 210
Зарегистрирован: 29 Август 2005, 14:54
Откуда: Белоруссия

libcurl for Clarion

Сообщение Alex »

Функция для декодирования - спасибо. (только из нее вызывается strtol()- описана где то видимо.)
Просто увидев внутри класса JSON ф-цию JSON.UnEscapeString, предположил , что она должна декодировать Esc кодировку....
Аватара пользователя
RaFaeL
✯ Ветеран ✯
Сообщения: 1376
Зарегистрирован: 24 Март 2009, 17:59
Откуда: НН
Благодарил (а): 7 раз
Поблагодарили: 1 раз
Контактная информация:

libcurl for Clarion

Сообщение RaFaeL »

Alex писал(а): 24 Март 2021, 18:26 только из нее вызывается strtol()- описана где то видимо.

Код: Выделить всё

    MODULE('WIN API')
     strtol(*cstring,long,long),long,raw,name('_strtol')
    END
Аватара пользователя
Alex
Старожил
Сообщения: 210
Зарегистрирован: 29 Август 2005, 14:54
Откуда: Белоруссия

libcurl for Clarion

Сообщение Alex »

Спасибо. Теперь связка libcurl и JSON работает.
Аватара пользователя
SergioRaguzini
Старожил
Сообщения: 234
Зарегистрирован: 08 Декабрь 2009, 19:16
Откуда: Краснодарский край
Благодарил (а): 6 раз

libcurl for Clarion

Сообщение SergioRaguzini »

Привет Всем!

Поставили мне задачу поключить учетную программу к API сайта заявок, с которого ответы на запросы идут не в XML (что для меня привычно), а в JSON, с обработкой которого я пока не сталкивался, поэтому прошу "не кидать тапками" за, возможно, глупые вопросы:
Изначально я решил реализовать это с помощью утилиты командной строки curl.exe, но прочитав данную тему libcurl for Clarion и тему CJSON, понимаю, что, вероятно, использование инструмента libcurl for Clarion может быть гораздо удобнее, итак

с простой предусмотренной API операцией передать HTTP заголовки и GET-запрос с помощью curl.exe трудностей не возникло:

Код: Выделить всё

curl.exe -H "Version: 2.0" -H "RequestCode: 884b7fc064a" -H "RequestSign: 2c9f389b07c" -X GET http://somesite.ru/api/orders/ -o ping_Response.txt
ответ перенаправил в ping_Response.txt, но в этом случае содержимое этого ответа минимально и можно обойтись без парсинга JSON
а вот другие операции, уже не такие простые и требуют,например POST-передачи данных ввиде JSON (который пришлось передавать ввиде отдельного файла):

Код: Выделить всё

curl.exe -H "Version: 2.0" -H "RequestCode: 884b7fc064a" -H "RequestSign: 2c9f389b07c" -X POST -d @quota_send.json http://somesite.ru/api/quota/ -o quota_Response.txt
Ответ на эту операцию уже значителен и без JSON-парсинга не обойтись...

Еще паралельно возникают вопросы при работе с JSON: как быть с кодировкой unicode unescape и как конвертировать при отправке в base64 encode

Я скачал libcurl-master и cJSON-master

- достаточно ли для вышеупомянутых примеров возможностей libcurl-master или же cJSON-master также необходим
- в каких примерах из Examples есть что-то похожее
- чем удобнее разобрать(получить в очередь) ответ в JSON (где глянуть такой пример)

Пока не пойму с чего начать, прошу совета уважаемого CLA-сообщества

Спасибо
Аватара пользователя
Alex
Старожил
Сообщения: 210
Зарегистрирован: 29 Август 2005, 14:54
Откуда: Белоруссия

libcurl for Clarion

Сообщение Alex »

Привет. Для парсинга JSON ответа я использовал JSON класс.
Чтобы лучше понять вопрос хотелось бы увидеть структуру JSON ответа.
Примеры есть в Examples.
Для запросов -ответов использовал libcurl for Clarion. Получение ответа происходит в строку. Без использования файла.
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3131
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 10 раз
Поблагодарили: 28 раз
Контактная информация:

libcurl for Clarion

Сообщение Дед Пахом »

Посмотрите здесь, очень похожий скрипт для curl и его эквивалент на libcurl.
С уважением, ДП
Аватара пользователя
SergioRaguzini
Старожил
Сообщения: 234
Зарегистрирован: 08 Декабрь 2009, 19:16
Откуда: Краснодарский край
Благодарил (а): 6 раз

libcurl for Clarion

Сообщение SergioRaguzini »

Alex писал(а): 16 Апрель 2021, 20:50 Привет. Для парсинга JSON ответа я использовал JSON класс.
Чтобы лучше понять вопрос хотелось бы увидеть структуру JSON ответа.
Примеры есть в Examples.
Для запросов -ответов использовал libcurl for Clarion. Получение ответа происходит в строку. Без использования файла.
Дед Пахом писал(а): 16 Апрель 2021, 21:14 Посмотрите здесь, очень похожий скрипт для curl и его эквивалент на libcurl.
СПАСИБО!
Закрыто