Страница 26 из 30
					
				libcurl for Clarion
				Добавлено: 12 Ноябрь 2015, 20:11
				 Дед Пахом
				Вроде все основные функции закрыл:
- выгрузка файлов с сервера
- загрузка файлов на сервер
- HTTP GET/POST с возможностью прочитать ответ сервера
- Поддержка SSL
Тестировал на протоколах http, https, ftp, sftp, ftpes.
Краткий туториал в файле \doc\How-To.txt.
 
 
 
			 
			
					
				libcurl for Clarion
				Добавлено: 23 Март 2021, 15:00
				 RaFaeL
				FromJSON работает элементарно. Вам надо создать группу из трех полей:  status (long), messages (string,DIM(10)), resp (string, DIM(сколько у вас возвращается я не знаю)). Дальше FromJSON(текст, группа), собственно вроде всё. Какие-то настройки при декодировании не обязательны. Но я с массивами стараюсь не работать, в основном через очереди, но там надо в 2 прохода
			 
			
					
				libcurl for Clarion
				Добавлено: 23 Март 2021, 15:19
				 Alex
				Спасибо за советы.  Пробую .
P.S. resp (string, DIM(XX))
XX  априори конечно неизвестен
После FromJSON(текст, группа) в группе поля пусты. хм.
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 пусты.
 
			 
			
					
				libcurl for Clarion
				Добавлено: 23 Март 2021, 21:48
				 Дед Пахом
				Пользовался cJSON и jFiles, предпочитаю cJSON.
			 
			
					
				libcurl for Clarion
				Добавлено: 24 Март 2021, 9:17
				 RaFaeL
				Alex писал(а): 23 Март 2021, 15:19
Поля JSONGroup пусты.
 
Префикс не надо у группы. Либо делайте у полей атрибут NAME
 
			 
			
					
				libcurl for Clarion
				Добавлено: 24 Март 2021, 13:10
				 Alex
				Префикс у группы убрал. Полям JSONGroup.resp значения не присваиваются.
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 массиве. 
Или я неправильно истолковал идеологию?
 
			 
			
					
				libcurl for Clarion
				Добавлено: 24 Март 2021, 15:07
				 RaFaeL
				Все верно. Я проверил, все присваивается (правда, кавычки не убирает, хотя вроде должен). Но у меня немного переписанный JSONDataClass, попробуйте
			 
			
					
				libcurl for Clarion
				Добавлено: 24 Март 2021, 17:53
				 Alex
				Для FromJSON в случае массива , в котором значения одного поля- список брэндов структура группы и очереди
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)
не приводит к преобразованию в символы.
 
			 
			
					
				libcurl for Clarion
				Добавлено: 24 Март 2021, 17:59
				 RaFaeL
				Alex писал(а): 24 Март 2021, 17:53
Значения в Esc кодировке остаются как были
 
Тут 
https://forum.clarionlife.net/viewtopic ... 296#p44296 я выкладывал функцию для декодирования. Это уже за рамками преобразования из собственно JSON
 
			 
			
					
				libcurl for Clarion
				Добавлено: 24 Март 2021, 18:26
				 Alex
				Функция для декодирования - спасибо.  (только из нее вызывается strtol()-  описана где то видимо.)
Просто увидев внутри класса JSON ф-цию JSON.UnEscapeString,  предположил , что она должна декодировать Esc кодировку....
			 
			
					
				libcurl for Clarion
				Добавлено: 25 Март 2021, 0:07
				 RaFaeL
				Alex писал(а): 24 Март 2021, 18:26
только из нее вызывается strtol()- описана где то видимо.
 
Код: Выделить всё
    MODULE('WIN API')
     strtol(*cstring,long,long),long,raw,name('_strtol')
    END
 
			 
			
					
				libcurl for Clarion
				Добавлено: 26 Март 2021, 1:28
				 Alex
				Спасибо. Теперь связка libcurl и JSON работает.
			 
			
					
				libcurl for Clarion
				Добавлено: 16 Апрель 2021, 20:04
				 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-сообщества
Спасибо
 
			 
			
					
				libcurl for Clarion
				Добавлено: 16 Апрель 2021, 20:50
				 Alex
				Привет.  Для парсинга JSON ответа я использовал JSON класс. 
Чтобы лучше понять вопрос хотелось бы увидеть структуру JSON ответа. 
Примеры есть в Examples.
Для запросов -ответов использовал libcurl for Clarion.  Получение ответа происходит в строку. Без использования файла.
			 
			
					
				libcurl for Clarion
				Добавлено: 16 Апрель 2021, 21:14
				 Дед Пахом
				Посмотрите 
здесь, очень похожий скрипт для curl и его эквивалент на libcurl.
 
			 
			
					
				libcurl for Clarion
				Добавлено: 16 Апрель 2021, 21:17
				 SergioRaguzini
				Alex писал(а): 16 Апрель 2021, 20:50
Привет.  Для парсинга JSON ответа я использовал JSON класс. 
Чтобы лучше понять вопрос хотелось бы увидеть структуру JSON ответа. 
Примеры есть в Examples.
Для запросов -ответов использовал libcurl for Clarion.  Получение ответа происходит в строку. Без использования файла.
 
Дед Пахом писал(а): 16 Апрель 2021, 21:14
Посмотрите 
здесь, очень похожий скрипт для curl и его эквивалент на libcurl.
 
СПАСИБО!