libcurl for Clarion
Добавлено: 02 Октябрь 2020, 11:40
Вообще-то полезнее было бы посмотреть не на декларацию метода XFerInfo, а на его реализацию.
Место общения программистов, форум разработчиков БД на Clarion
https://forum.clarionlife.net/
Код: Выделить всё
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
Код: Выделить всё
Proc1 PROCEDURE(), LONG
Код: Выделить всё
Proc1() !- вместо ret = Proc1()
Код: Выделить всё
XFerInfo PROCEDURE(REAL dltotal, REAL dlnow, REAL ultotal, REAL ulnow), LONG, PROC, VIRTUAL
Держите в курсе...
При вызове любого метода сервиса для установления защищенного по ГОСТ https-соединения необходимо передавать сведения о сертификате инициатора запроса (тот же сертификат, который используется для входа в защищенный Личный кабинет на официальном сайте ).
Например, на языке программирования C# это будет выглядеть следующим образом:
Код: Выделить всё
public HttpClient CreateHttpClient (X509Certificate2 cert) { var handler = new WebRequestHandler(); handler.ClientCertificates.add(cert); return new HttpClient(handler); }
Код: Выделить всё
curl.SetOpt(CURLOPT_POSTFIELDS, 'Двоичное DER-представление X.509-сертификата пользователя')
curl.SetOpt(CURLOPT_POSTFIELDSIZE, LEN(CLIP('Двоичное DER-представление X.509-сертификата пользователя')))
Код: Выделить всё
sCertFile STRING(256), AUTO
sCertType STRING(20), AUTO
sCertFile = 'estcert.pem'
sCertType = 'PEM'
curl.SetOpt(CURLOPT_SSLCERT, sCertFile)
curl.SetOpt(CURLOPT_SSLCERTTYPE, sCertType)
Спасибо, просто меня смутила фраза "передавать сведения "Дед Пахом писал(а): ↑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)
Например, при запросе по API получить список брэндов, латинобуквенные не кодируются , остальные кодируются.Игорь Столяров писал(а): ↑23 Март 2021, 14:23 P/S: А что JSON ключница делала ? Почему только часть ответа в ESC кодировке ?
Использую 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)