libcurl for Clarion
Модератор: Дед Пахом
Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
- RaFaeL
- ✯ Ветеран ✯
- Сообщения: 1376
- Зарегистрирован: 24 Март 2009, 17:59
- Откуда: НН
- Благодарил (а): 7 раз
- Поблагодарили: 1 раз
- Контактная информация:
libcurl for Clarion
FromJSON работает элементарно. Вам надо создать группу из трех полей: status (long), messages (string,DIM(10)), resp (string, DIM(сколько у вас возвращается я не знаю)). Дальше FromJSON(текст, группа), собственно вроде всё. Какие-то настройки при декодировании не обязательны. Но я с массивами стараюсь не работать, в основном через очереди, но там надо в 2 прохода
libcurl for Clarion
Спасибо за советы. Пробую .
P.S. resp (string, DIM(XX))
XX априори конечно неизвестен
После FromJSON(текст, группа) в группе поля пусты. хм.
Странно.
LocString &= NEW(STRING(LEN(CLIP(JSONstring))))
Неужели создается нулевой длины. Да. Нашел ошибку. Теперь в LocString значение JSONString присваивается. Но после вызова JSON.FromJSON(LocString, JSONGroup)
Поля JSONGroup пусты.
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
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 пусты.
- RaFaeL
- ✯ Ветеран ✯
- Сообщения: 1376
- Зарегистрирован: 24 Март 2009, 17:59
- Откуда: НН
- Благодарил (а): 7 раз
- Поблагодарили: 1 раз
- Контактная информация:
libcurl for Clarion
Префикс у группы убрал. Полям JSONGroup.resp значения не присваиваются.
Как я понимаю , поскольку JSON строка это одномерный массив, то в поле группы
resp string(100),DIM(10000)
эта JSON строка должна разместиться. Где 100- макс.длина элемента JSON массива. Где 10000 - максимальное значение элементов в JSON массиве.
Или я неправильно истолковал идеологию?
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
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
resp string(100),DIM(10000)
эта JSON строка должна разместиться. Где 100- макс.длина элемента JSON массива. Где 10000 - максимальное значение элементов в JSON массиве.
Или я неправильно истолковал идеологию?
- RaFaeL
- ✯ Ветеран ✯
- Сообщения: 1376
- Зарегистрирован: 24 Март 2009, 17:59
- Откуда: НН
- Благодарил (а): 7 раз
- Поблагодарили: 1 раз
- Контактная информация:
libcurl for Clarion
Все верно. Я проверил, все присваивается (правда, кавычки не убирает, хотя вроде должен). Но у меня немного переписанный JSONDataClass, попробуйте
- Вложения
-
- JSON.ZIP
- (13.86 КБ) 170 скачиваний
libcurl for Clarion
Для FromJSON в случае массива , в котором значения одного поля- список брэндов структура группы и очереди
Тогда JSON.FromJson(LocString, BrandsQueue) формирует очередь брэндов (без кавычек кстати)
Значения в Esc кодировке остаются как были
"\u042f\u0428\u041a\u0418\u041d\u041e","\u042f\u0428\u0424"
выполнение
LocString = JSON.UnEscapeString(LocString)
не приводит к преобразованию в символы.
Spoiler
Brandsgroup GROUP
Name STRING(100)
END
BrandsQueue Queue(Brandsgroup)
END
Name STRING(100)
END
BrandsQueue Queue(Brandsgroup)
END
Значения в 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
Тут https://forum.clarionlife.net/viewtopic ... 296#p44296 я выкладывал функцию для декодирования. Это уже за рамками преобразования из собственно JSON
libcurl for Clarion
Функция для декодирования - спасибо. (только из нее вызывается strtol()- описана где то видимо.)
Просто увидев внутри класса JSON ф-цию JSON.UnEscapeString, предположил , что она должна декодировать Esc кодировку....
Просто увидев внутри класса JSON ф-цию JSON.UnEscapeString, предположил , что она должна декодировать Esc кодировку....
- RaFaeL
- ✯ Ветеран ✯
- Сообщения: 1376
- Зарегистрирован: 24 Март 2009, 17:59
- Откуда: НН
- Благодарил (а): 7 раз
- Поблагодарили: 1 раз
- Контактная информация:
libcurl for Clarion
Код: Выделить всё
MODULE('WIN API')
strtol(*cstring,long,long),long,raw,name('_strtol')
END
- SergioRaguzini
- Старожил
- Сообщения: 236
- Зарегистрирован: 08 Декабрь 2009, 19:16
- Откуда: Краснодарский край
- Благодарил (а): 6 раз
libcurl for Clarion
Привет Всем!
Поставили мне задачу поключить учетную программу к API сайта заявок, с которого ответы на запросы идут не в XML (что для меня привычно), а в JSON, с обработкой которого я пока не сталкивался, поэтому прошу "не кидать тапками" за, возможно, глупые вопросы:
Изначально я решил реализовать это с помощью утилиты командной строки curl.exe, но прочитав данную тему libcurl for Clarion и тему CJSON, понимаю, что, вероятно, использование инструмента libcurl for Clarion может быть гораздо удобнее, итак
с простой предусмотренной API операцией передать HTTP заголовки и GET-запрос с помощью curl.exe трудностей не возникло:
ответ перенаправил в ping_Response.txt, но в этом случае содержимое этого ответа минимально и можно обойтись без парсинга JSON
а вот другие операции, уже не такие простые и требуют,например POST-передачи данных ввиде JSON (который пришлось передавать ввиде отдельного файла):
Ответ на эту операцию уже значителен и без JSON-парсинга не обойтись...
Еще паралельно возникают вопросы при работе с JSON: как быть с кодировкой unicode unescape и как конвертировать при отправке в base64 encode
Я скачал libcurl-master и cJSON-master
- достаточно ли для вышеупомянутых примеров возможностей libcurl-master или же cJSON-master также необходим
- в каких примерах из Examples есть что-то похожее
- чем удобнее разобрать(получить в очередь) ответ в JSON (где глянуть такой пример)
Пока не пойму с чего начать, прошу совета уважаемого CLA-сообщества
Спасибо
Поставили мне задачу поключить учетную программу к 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
а вот другие операции, уже не такие простые и требуют,например 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: как быть с кодировкой unicode unescape и как конвертировать при отправке в base64 encode
Я скачал libcurl-master и cJSON-master
- достаточно ли для вышеупомянутых примеров возможностей libcurl-master или же cJSON-master также необходим
- в каких примерах из Examples есть что-то похожее
- чем удобнее разобрать(получить в очередь) ответ в JSON (где глянуть такой пример)
Пока не пойму с чего начать, прошу совета уважаемого CLA-сообщества
Спасибо
libcurl for Clarion
Привет. Для парсинга JSON ответа я использовал JSON класс.
Чтобы лучше понять вопрос хотелось бы увидеть структуру JSON ответа.
Примеры есть в Examples.
Для запросов -ответов использовал libcurl for Clarion. Получение ответа происходит в строку. Без использования файла.
Чтобы лучше понять вопрос хотелось бы увидеть структуру JSON ответа.
Примеры есть в Examples.
Для запросов -ответов использовал libcurl for Clarion. Получение ответа происходит в строку. Без использования файла.
- SergioRaguzini
- Старожил
- Сообщения: 236
- Зарегистрирован: 08 Декабрь 2009, 19:16
- Откуда: Краснодарский край
- Благодарил (а): 6 раз
libcurl for Clarion
Alex писал(а): ↑16 Апрель 2021, 20:50 Привет. Для парсинга JSON ответа я использовал JSON класс.
Чтобы лучше понять вопрос хотелось бы увидеть структуру JSON ответа.
Примеры есть в Examples.
Для запросов -ответов использовал libcurl for Clarion. Получение ответа происходит в строку. Без использования файла.
СПАСИБО!