libcurl for Clarion

Модератор: Дед Пахом

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3131
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 10 раз
Поблагодарили: 28 раз
Контактная информация:

libcurl for Clarion

Сообщение Дед Пахом »

Игорь Столяров писал(а): 09 Август 2018, 18:59Возможно ли сделать вариант метода Curl.FormPostStr() с типом данных для строки с ответом *IDynStr ?
Как в методе Curl.SendRequest. Просто неизвестно какого размера будет строка с ответом на запрос ...
Игорь, сделал (FormPost(STRING pUrl, *IDynStr pDynStr, <curl::ProgressDataProcType xferproc>)), но не проверял, сообщи результат, тогда выложу на GitHub.
Вложения
libcurl.inc
(70.52 КБ) 326 скачиваний
libcurlhttp.clw
(7.66 КБ) 335 скачиваний
С уважением, ДП
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7327
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

libcurl for Clarion

Сообщение Игорь Столяров »

Спасибо ! Оттестюсь и сообщу (пара дней). :)
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7327
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

libcurl for Clarion

Сообщение Игорь Столяров »

Дед Пахом писал(а): 09 Август 2018, 19:22Игорь, сделал (FormPost(STRING pUrl, *IDynStr pDynStr, <curl::ProgressDataProcType xferproc>))
Спасибо, проверил всё прекрасно работает. По крайне мере на моих примерах проблем нет.

Можно я задам вопрос не по технологии, а по её применению ?
Нужно получить с незапароленного сайта страницу в строку (и далее её распарсить и обработать).
На примере страницы с курсами валют ЦБ РФ я делаю вот так:

Код: Выделить всё


   Loc:WebString &= GetStringHTTP('http://www.cbr.ru/currency_base/D_print.aspx?date_req=11.08.2018')
   If ~(Loc:WebString &= NULL) ….

!----

GetStringHTTP  Procedure(String xURL_)  !, *String

Curl            TCurlHttpClass
Loc:Res         CURLcode
Loc:RespBuffer  &IDynStr
Loc:RetValue  &String

  CODE
  
  Loc:RetValue &= NULL
  Loc:RespBuffer &= NewDynStr()
  
  Curl.Init()

  Loc:Res = Curl.FormPost(Clip(xURL_), Loc:RespBuffer)
  If Loc:Res = CURLE_OK
     If Loc:RespBuffer.StrLen() > 0
        Loc:RetValue &= New(String(Loc:RespBuffer.StrLen()))  ! Создаем буфер для загрузки по размеру строки
        If ~(Loc:RetValue &= Null) then Loc:RespBuffer.CopyTo(Loc:RetValue,Loc:RespBuffer.StrLen()).
     end
  elsIf Loc:Res = -1
     Message(' Неизвестная ошибка запроса FormPost: ' & Loc:Res)
  else
     Message(' Ошибка запроса FormPost: ' & Loc:Res & '| ' & Curl.StrError(Loc:Res))
  end

  DisposeDynStr(Loc:RespBuffer)
  Return Loc:RetValue
Почему возник вопрос. Где-то в ответ на один из десяти запросов я получаю пустую строку (не ошибку !).
То ли сервис козлит, то ли я в принципе чего-то не понимаю, как нужно получать страницу с сайта через LibCurl,
или надо выставлять какие-то параметры запроса в LibCurl (TimeOut ?) …
"Старый" вариант такого запроса через WinAPI (WinINet) работает без этой проблемы многие годы.
Заранее спасибо за наводку ... :)
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3131
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 10 раз
Поблагодарили: 28 раз
Контактная информация:

libcurl for Clarion

Сообщение Дед Пахом »

Игорь Столяров писал(а): 11 Август 2018, 7:02Loc:Res = Curl.FormPost(Clip(xURL_), Loc:RespBuffer)
Для этой задачи FormPost совершенно не к месту, простой GET запрос получает страницу:

Код: Выделить всё

res = curl.SendRequest('http://www.cbr.ru/currency_base/daily/', 'date_req=11.08.2018', respbuffer)
С уважением, ДП
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7327
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

libcurl for Clarion

Сообщение Игорь Столяров »

Дед Пахом писал(а): 11 Август 2018, 11:19простой GET запрос получает страницу
Я с этого начинал. :( Как раз проблема засветилась на новых примерах, которые Вы анонсировали …
Стал проверять свой старый код - та же беда. :( Пришёл к тому, что корректно работает только FormPOST.
Можно я сброшу в личку реальный пример запроса с проблемой (там всего 2 строки запроса для проверки) ?
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3131
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 10 раз
Поблагодарили: 28 раз
Контактная информация:

libcurl for Clarion

Сообщение Дед Пахом »

Игорь Столяров писал(а): 11 Август 2018, 11:46Можно я сброшу в личку реальный пример запроса с проблемой
Конечно.
С уважением, ДП
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7327
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

libcurl for Clarion

Сообщение Игорь Столяров »

Заранее извиняюсь, если вопрос дилетантский, но таки непонятно ...

При многократном запросе GET метод Curl.SendRequest(MyUrl) начинает холявить и возвращает страницу MyUrl из кеша … ;)
Есть ли в библиотеке LibCurl возможность сброса кеша перед запросом (аналог DeleteUrlCacheEntry(MyUrl) в WinINET API) ?
Заранее спасибо ... :)
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3131
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 10 раз
Поблагодарили: 28 раз
Контактная информация:

libcurl for Clarion

Сообщение Дед Пахом »

Игорь Столяров писал(а): 14 Август 2018, 9:43звращает страницу MyUrl из кеша
https://stackoverflow.com/questions/26547608/how-to-stop-curl-from-caching-data писал(а):curl doesn't cache anything, it simply sends a HTTP request to the server (and with CURLOPT_VERBOSE you can easily inspect it) and then it pipes all data it receives on to the write callback that you provide. There's no caching, no middle layers, no magic.
В общем, я бы для начала передал в заголовке Cache-Control: "no-cache", чтобы сервер обновлял данные.
С уважением, ДП
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7327
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

libcurl for Clarion

Сообщение Игорь Столяров »

Добавил конструкцию

Код: Выделить всё

  Curl.FreeHttpHeaders()
  Curl.AddHttpHeader('Cache-Control: no-cache')
  If Curl.SetHttpHeaders() <> CURLE_OK.
Но всё равно, что-то не очень понятное происходит. :(
Не могу поймать устойчивую комбинацию, возможно, это эпизодически козлит запрашиваемый сервис.
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7327
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

libcurl for Clarion

Сообщение Игорь Столяров »

Парадокс LibCurl в том, что чем больше я его настраиваю - тем хуже он работает.
Запутавшись в окончательно в параметрах и описаниях - убрал вообще всё до by default … и наконец-то оно заработало ! :)

Кстати, в примерах есть маленький косяк-с.
Процедура SendHTTPRequest в TestHTTP.APP

Код: Выделить всё

    curl.FreeHttpHeaders()
    IF RECORDS(HttpHeaders)
        LOOP qIndex = 1 TO RECORDS(HttpHeaders)
            GET(HttpHeaders, qIndex)
            curl.AddHttpHeader(HttpHeaders.HttpHeader)
            IF res <> CURLE_OK              ! <<<<-----  ВОТ ЗДЕСЬ ПРОВЕРЯЕТСЯ ТО, ЧЕГО НЕ МОЖЕТ БЫТЬ .... 
                MESSAGE('AddHttpHeader failed: '& curl.StrError(res), 'libcurl', ICON:Exclamation)
            END
        END
        res = curl.SetHttpHeaders()
        IF res <> CURLE_OK
            MESSAGE('SetHttpHeaders failed: '& curl.StrError(res), 'libcurl', ICON:Exclamation)
        END
    END
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3131
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 10 раз
Поблагодарили: 28 раз
Контактная информация:

libcurl for Clarion

Сообщение Дед Пахом »

Игорь Столяров писал(а): 14 Август 2018, 21:05Кстати, в примерах есть маленький косяк-с.
Есть такое. Правда, примеры к 6-ке я особо не проверяю, собираются, работают - и ладно.
С уважением, ДП
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7327
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

libcurl for Clarion

Сообщение Игорь Столяров »

Дед Пахом писал(а): 14 Август 2018, 21:32примеры к 6-ке я особо не проверяю
Ввиду полного отсутствия описания к LibCurl, все примеры - это очень полезный учебный материал. ;)
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3131
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 10 раз
Поблагодарили: 28 раз
Контактная информация:

libcurl for Clarion

Сообщение Дед Пахом »

Игорь Столяров писал(а): 14 Август 2018, 21:50Ввиду полного отсутствия описания к LibCurl
А это что https://curl.haxx.se/libcurl/?
С уважением, ДП
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7327
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

libcurl for Clarion

Сообщение Игорь Столяров »

Это я знаю … даже читаю. Иногда.
Но как бы понятней, то что ближе к объекту обсуждения на форуме.
И реализация классов для Clarion. Поэтому учимся по примерам. :)
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7327
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

libcurl for Clarion

Сообщение Игорь Столяров »

Добрый день !

Можно ли мечтать о методе:

Код: Выделить всё

FormPost  PROCEDURE(STRING pUrl, *IDynStr pDynStr, <curl::ProgressDataProcType xferproc>), CURLcode, PROC
но с передачей параметров pPostFields, т.е. аналогично традиционному запросу:

Код: Выделить всё

SendRequest  PROCEDURE(STRING pUrl, <STRING pPostFields>, *IDynStr pDynStr, <curl::ProgressDataProcType xferproc>), CURLcode, PROC
Cейчас при вызове FormPost прикручиваю параметры к строке pUrl через "?", что не совсем правильно ...
Заранее спасибо за рассмотрение вопроса ! :)
За теми кто отстал - не возвращаться. (С) Кодекс
Закрыто