libcurl for Clarion
Модератор: Дед Пахом
Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
- Дед Пахом
- Старичок
- Сообщения: 3133
- Зарегистрирован: 07 Июль 2005, 16:51
- Откуда: Москва, Россия
- Благодарил (а): 10 раз
- Поблагодарили: 28 раз
- Контактная информация:
libcurl for Clarion
Вообще-то полезнее было бы посмотреть не на декларацию метода XFerInfo, а на его реализацию.
С уважением, ДП
- Игорь Столяров
- Ветеран движения
- Сообщения: 7375
- Зарегистрирован: 07 Июль 2005, 10:19
- Откуда: г. Ростов-на-ДоМу
- Благодарил (а): 13 раз
- Поблагодарили: 48 раз
libcurl for Clarion
Там ничего военного, правда есть один спорный момент с использованием xIndicator_ ...
Но сразу хочу сказать, что проблему наблюдаю при вызове с xIndicator_ = 0.
Но сразу хочу сказать, что проблему наблюдаю при вызове с xIndicator_ = 0.
Код: Выделить всё
LoadFileHTTP PROCEDURE (LocalFile_,URL_,xIndicator_)
TCurlHTTPClassEx Class(TCurlHTTPClass),Type
XFerInfo PROCEDURE(REAL dltotal, REAL dlnow, REAL ultotal, REAL ulnow), LONG, DERIVED
end
MyCurl TCurlHTTPClassEx
Code
MyCurl.Init()
...
CurlRes = MyCurl.ReadFile(URL_, LocalFile_)
... ! Обработка ошибок и завершение
! --- Собственно переопределение индикации загрузки
TCurlHTTPClassEx.XFerInfo PROCEDURE(REAL dltotal, REAL dlnow, REAL ultotal, REAL ulnow)
Code
If xIndicator_ > 0
If dlnow
If dltotal
xIndicator_{Prop:Progress} = dlnow * 100 / dltotal
else
xIndicator_{Prop:Progress} = dlnow / 1000
end
end
end
RETURN 0
За теми кто отстал - не возвращаться. (С) Кодекс
- Дед Пахом
- Старичок
- Сообщения: 3133
- Зарегистрирован: 07 Июль 2005, 16:51
- Откуда: Москва, Россия
- Благодарил (а): 10 раз
- Поблагодарили: 28 раз
- Контактная информация:
libcurl for Clarion
Очень похоже на проблему, на которую многие жалуются (например здесь) - вызов функции без проверки возвращаемого значения. То есть к примеру объявлена функция
а в коде она вызывается
В базовом классе TCurlClass XFerInfo имеет атрибут PROC, а у Вас в наследнике его нет, попробуйте добавить:
Код: Выделить всё
Proc1 PROCEDURE(), LONG
Код: Выделить всё
Proc1() !- вместо ret = Proc1()
Код: Выделить всё
XFerInfo PROCEDURE(REAL dltotal, REAL dlnow, REAL ultotal, REAL ulnow), LONG, PROC, VIRTUAL
С уважением, ДП
- Игорь Столяров
- Ветеран движения
- Сообщения: 7375
- Зарегистрирован: 07 Июль 2005, 10:19
- Откуда: г. Ростов-на-ДоМу
- Благодарил (а): 13 раз
- Поблагодарили: 48 раз
libcurl for Clarion
Спасибо ! Понял, сейчас буду исправлять и тестировать ...
Я это сообщение на CHUB видел, но пропустил, т.к. всегда слежу за типизацией параметров процедур (сложно отлавливаемые проблемы).
А переопределение XFerInfo брал из примера к LibCurl и наверно пропустил изменения параметров при обновлении библиотеки.
Я это сообщение на CHUB видел, но пропустил, т.к. всегда слежу за типизацией параметров процедур (сложно отлавливаемые проблемы).
А переопределение XFerInfo брал из примера к LibCurl и наверно пропустил изменения параметров при обновлении библиотеки.
За теми кто отстал - не возвращаться. (С) Кодекс
- Дед Пахом
- Старичок
- Сообщения: 3133
- Зарегистрирован: 07 Июль 2005, 16:51
- Откуда: Москва, Россия
- Благодарил (а): 10 раз
- Поблагодарили: 28 раз
- Контактная информация:
libcurl for Clarion
Доброго всем дня!
Читаю доку по одному сайту (RestAPI, JSON)
В curl это будет так?:
Это я выискал в этой ветке...
Читаю доку по одному сайту (RestAPI, JSON)
При вызове любого метода сервиса для установления защищенного по ГОСТ https-соединения необходимо передавать сведения о сертификате инициатора запроса (тот же сертификат, который используется для входа в защищенный Личный кабинет на официальном сайте ).
Например, на языке программирования C# это будет выглядеть следующим образом:
Код: Выделить всё
public HttpClient CreateHttpClient (X509Certificate2 cert) { var handler = new WebRequestHandler(); handler.ClientCertificates.add(cert); return new HttpClient(handler); }
В curl это будет так?:
Код: Выделить всё
curl.SetOpt(CURLOPT_POSTFIELDS, 'Двоичное DER-представление X.509-сертификата пользователя')
curl.SetOpt(CURLOPT_POSTFIELDSIZE, LEN(CLIP('Двоичное DER-представление X.509-сертификата пользователя')))
- Дед Пахом
- Старичок
- Сообщения: 3133
- Зарегистрирован: 07 Июль 2005, 16:51
- Откуда: Москва, Россия
- Благодарил (а): 10 раз
- Поблагодарили: 28 раз
- Контактная информация:
libcurl for Clarion
Не пробовал, но логичнее использовать CURLOPT_SSLCERT, CURLOPT_SSLCERTTYPE:
Код: Выделить всё
sCertFile STRING(256), AUTO
sCertType STRING(20), AUTO
sCertFile = 'estcert.pem'
sCertType = 'PEM'
curl.SetOpt(CURLOPT_SSLCERT, sCertFile)
curl.SetOpt(CURLOPT_SSLCERTTYPE, sCertType)
С уважением, ДП
libcurl for Clarion
Cgfcb,j
Если бы просто написали, надо использовать свой сертификат для SSL, тогда понятно
Если смогу подключиться - отпишу (не скоро, рутины много...)
Спасибо, просто меня смутила фраза "передавать сведения "Дед Пахом писал(а): ↑14 Октябрь 2020, 15:56 Не пробовал, но логичнее использовать CURLOPT_SSLCERT, CURLOPT_SSLCERTTYPE:Код: Выделить всё
sCertFile STRING(256), AUTO sCertType STRING(20), AUTO sCertFile = 'estcert.pem' sCertType = 'PEM' curl.SetOpt(CURLOPT_SSLCERT, sCertFile) curl.SetOpt(CURLOPT_SSLCERTTYPE, sCertType)
Если бы просто написали, надо использовать свой сертификат для SSL, тогда понятно
Если смогу подключиться - отпишу (не скоро, рутины много...)
libcurl for Clarion
на
CURLOPT_SSLCERT
unable to set private key file: 'SSL\MyCert.pem' type PEM
Ведь для SSL нужен и секретный ключ, кроме самого сертификата
получается, надо и
CURLOPT_SSLKey
CURLOPT_SSLCERT
unable to set private key file: 'SSL\MyCert.pem' type PEM
Ведь для SSL нужен и секретный ключ, кроме самого сертификата
получается, надо и
CURLOPT_SSLKey
libcurl for Clarion
Прошу совета. Для решения задачи получения данных от веб сервиса использую libcurl. Ответ возвращается в виде строки JSON.
Часть JSON ответа кодирована Esc кодировкой( не латинские буквы).
Чем воспользоваться для превращения JSON ответа в QUEUE?
= FromJSON , описанным в хелпе нашего IDE (CW11)
= cJSON библиотекой
= Capesoft JSON
= или что-то иное
Часть JSON ответа кодирована Esc кодировкой( не латинские буквы).
Чем воспользоваться для превращения JSON ответа в QUEUE?
= FromJSON , описанным в хелпе нашего IDE (CW11)
= cJSON библиотекой
= Capesoft JSON
= или что-то иное
- Игорь Столяров
- Ветеран движения
- Сообщения: 7375
- Зарегистрирован: 07 Июль 2005, 10:19
- Откуда: г. Ростов-на-ДоМу
- Благодарил (а): 13 раз
- Поблагодарили: 48 раз
libcurl for Clarion
Наверно, ответить по существу можно только видя распарсиваемый JSON.
Инструмент выбирается по задаче, нам вполне хватает штатного FromJSON.
P/S: А что JSON ключница делала ? Почему только часть ответа в ESC кодировке ?
Инструмент выбирается по задаче, нам вполне хватает штатного FromJSON.
P/S: А что JSON ключница делала ? Почему только часть ответа в ESC кодировке ?
За теми кто отстал - не возвращаться. (С) Кодекс
libcurl for Clarion
Например, при запросе по API получить список брэндов, латинобуквенные не кодируются , остальные кодируются.Игорь Столяров писал(а): ↑23 Март 2021, 14:23 P/S: А что JSON ключница делала ? Почему только часть ответа в ESC кодировке ?
Пример (фрагмент) ответа API:
Spoiler
{"STATUS":200,"MESSAGES":[],"RESP":["1-2-PRO","1000 MIGLIA","16F","1AAAPARTS","1NEW","2X3","3F QUALITY","3GTTP","3M","3RG","3TON","4CR","4MAX","4RIDE","4SEASONS","4U","4WALLS","555","5BITES","5M","7 DAYS","77","888","A-ENGINEERING","A-GIST","A-GRESSOR","A-KOR","A-LIFT","A-MEGA","A-N PARTS","A-ONE","A-SPORT","A-TECH","A-VM","A.B.S.","A.D.M.","A.D.R.","A.S.DIXON","A2DM","A4TECH","AA","AA-TOP","AB TRUCK PARTS","AB-FILTER","AB-PARTS","ABA","ABAC","ABAKUS","ABAL","ABB","ABE","ABESTA","ABEX","ABG","ABLTON","ABRAFLEX","ABRO","ABSCO","ABSOLUT","ABT","ABW","AC","AC DELCO","AC-ACCESSORIES","AC\/DC","ACA","ACADEMY","ACADEMY STYLE","ACAR","ACCURIDE","ACE TRI-STAR","ACER","ACERBI","ACERMANN","ACHEMA","ACHILLES","ACHIM","ACHR","ACKOJA","ACL","ACME","ACME-TRUMP","ACN","ACQ","ACR","ACROLCAR","ACS","ACTIO","ACTION","ACTION!","ACTIVEAVTO","ACTIVPROFI","ACTM","ACTUAL","ACUMEN","ACURA","ACV","AD","AD KUHNER","AD RADIATORS","AD-PARTS","ADAICO","ADAMAL","ADBLUE","ADDAX-Q","ADDBLUEOFF","ADDINOL","ADELTECH","ADI","ADIDAS","ADK","ADL","ADMAL","ADR","ADRIAUTO","ADVAN-TECH","ADVICS","ADVOCAM","AE","AE&T","AE-LUS","AEBI","AEG","AEOLUS","AEP","AER DIESEL","AERO","AERO COMFORT","AEROCDM","AEROSTAR","AES","AEZ","AFA","AFAM","AFB","AFK","AFTERMARKET CHINA","AG","AG CHEM EQUIPMENT","AG DIESEL","AGA","AGAMA","AGAT AVTO","AGATEK","AGC","AGCO","AGG","AGIP","AGIS","AGRIA","AG\u0421","AHMAD TEA","\u0410\u0420\u0422\u0418","\u0410\u0420\u0422\u0424\u041e\u0420\u041c","\u0410\u0421\u041e\u041c\u0418","\u0410\u0421\u0422\u0415\u041a\u0421","\u042f \u0420\u041e\u0414\u0418\u041b\u0421\u042f","\u042f\u0412\u0412\u0410","\u042f\u0412\u0422\u0423\u0428\u0415\u041d\u041a\u041e","\u042f\u0417\u0414\u0410","\u042f\u0417\u0422\u041e-\u0410\u0412\u0422\u041e","\u042f\u0420\u041a\u0418\u0419 \u041b\u0423\u0427","\u042f\u0420\u041f\u041e\u0416\u0418\u041d\u0412\u0415\u0421\u0422","\u042f\u0420\u0422\u0418","\u042f\u0421\u041c\u0410","\u042f\u0428\u041a\u0418\u041d\u041e","\u042f\u0428\u0424","\u21161 SCHOOL"]}
Последний раз редактировалось Alex 23 Март 2021, 14:38, всего редактировалось 1 раз.
- RaFaeL
- ✯ Ветеран ✯
- Сообщения: 1377
- Зарегистрирован: 24 Март 2009, 17:59
- Откуда: НН
- Благодарил (а): 7 раз
- Поблагодарили: 1 раз
- Контактная информация:
libcurl for Clarion
Использую FromJSON от С10, но несколько раз его правил, так как сервисов уже десятки, везде разные "приколы" скажем такAlex писал(а): ↑23 Март 2021, 12:58 Прошу совета. Для решения задачи получения данных от веб сервиса использую libcurl. Ответ возвращается в виде строки JSON.
Часть JSON ответа кодирована Esc кодировкой( не латинские буквы).
Чем воспользоваться для превращения JSON ответа в QUEUE?
= FromJSON , описанным в хелпе нашего IDE (CW11)
= cJSON библиотекой
= Capesoft JSON
= или что-то иное
Плюс для перекодировки разного, что встречается в ответах, написал (или откуда-то скопировал) всякие свои мелкие процедуры
Код: Выделить всё
DecodeStr PROCEDURE(*string sIn)
c2 STRING(16)
c3 CSTRING(16)
c4 CSTRING(16)
sOut &CSTRING
Blength LONG
Slength LONG
CODE
Blength = len(clip(sIn)) + 100
sOut &= NEW(CSTRING(Blength))
clear(sOut)
loop
i# += 1
if len(clip(sIn)) < i# then break.
case sIn[i#]
of '\'
if len(clip(sIn)) < i#+1 then break.
case sIn[i#+1]
of 'b'
sOut = sOut &'<08>'
of 't'
sOut = sOut &'<09>'
of 'n'
sOut = sOut &'<10>'
of 'f'
sOut = sOut &'<12>'
of 'r'
sOut = sOut &'<13>'
of 'u'
clear(c2)
c3 = sub(sIn,i#+4,2)
ccc1# = strtol(c3,ccc2#,16)
c2[1] = chr(ccc1#)
c3 = sub(sIn,i#+2,2)
ccc1# = strtol(c3,ccc2#,16)
c2[2] = chr(ccc1#)
c3 = all('<0>',size(c3))
c4 = all('<0>',size(c4))
c4 = clip(c2)
Blength = size(c4)
Slength = size(c3)
RetCode# = winapi::WideCharToMultiByte (1251, 0, address(c4), Blength, address(c3), Slength, 0, 0)
sOut = sOut & clip(c3)
i#+= 4
else
sOut = sOut & sIn[i#+1]
end
i#+= 1
else
sOut = sOut & sIn[i#]
end
end
sIn = sOut
dispose(sOut)
- RaFaeL
- ✯ Ветеран ✯
- Сообщения: 1377
- Зарегистрирован: 24 Март 2009, 17:59
- Откуда: НН
- Благодарил (а): 7 раз
- Поблагодарили: 1 раз
- Контактная информация:
libcurl for Clarion
В квадратных скобках это массив одномерный, там и не должно быть ничего, кроме значений
libcurl for Clarion
Т.е. стОит попробовать встроенный класс JSON. Посмотрел examples, не пойму как указывать разметку перед парсингом FromJSON.. Как я понимаю, надо ведь указать разделители ...