libcurl for Clarion
Добавлено: 12 Ноябрь 2015, 20:11
				
				
			Место общения программистов, форум разработчиков БД на Clarion
https://www.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)
В квадратных скобках это массив одномерный, там и не должно быть ничего, кроме значенийAlex писал(а): 23 Март 2021, 14:28 Поля не разделяются фигурными скобками. Нет имен полей. Только значения.