Игорь, сделал (FormPost(STRING pUrl, *IDynStr pDynStr, <curl::ProgressDataProcType xferproc>)), но не проверял, сообщи результат, тогда выложу на GitHub.Игорь Столяров писал(а): ↑09 Август 2018, 18:59Возможно ли сделать вариант метода Curl.FormPostStr() с типом данных для строки с ответом *IDynStr ?
Как в методе Curl.SendRequest. Просто неизвестно какого размера будет строка с ответом на запрос ...
libcurl for Clarion
Модератор: Дед Пахом
Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
- Дед Пахом
- Старичок
- Сообщения: 3143
- Зарегистрирован: 07 Июль 2005, 16:51
- Откуда: Москва, Россия
- Благодарил (а): 11 раз
- Поблагодарили: 32 раза
- Контактная информация:
libcurl for Clarion
- Вложения
-
- libcurl.inc
- (70.52 КБ) 376 скачиваний
-
- libcurlhttp.clw
- (7.66 КБ) 385 скачиваний
С уважением, ДП
- Игорь Столяров
- Ветеран движения
- Сообщения: 7447
- Зарегистрирован: 07 Июль 2005, 10:19
- Откуда: г. Ростов-на-ДоМу
- Благодарил (а): 16 раз
- Поблагодарили: 51 раз
libcurl for Clarion
Спасибо ! Оттестюсь и сообщу (пара дней).
За теми кто отстал - не возвращаться. (С) Кодекс
- Игорь Столяров
- Ветеран движения
- Сообщения: 7447
- Зарегистрирован: 07 Июль 2005, 10:19
- Откуда: г. Ростов-на-ДоМу
- Благодарил (а): 16 раз
- Поблагодарили: 51 раз
libcurl for Clarion
Спасибо, проверил всё прекрасно работает. По крайне мере на моих примерах проблем нет.
Можно я задам вопрос не по технологии, а по её применению ?
Нужно получить с незапароленного сайта страницу в строку (и далее её распарсить и обработать).
На примере страницы с курсами валют ЦБ РФ я делаю вот так:
Код: Выделить всё
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) работает без этой проблемы многие годы.
Заранее спасибо за наводку ...
За теми кто отстал - не возвращаться. (С) Кодекс
- Дед Пахом
- Старичок
- Сообщения: 3143
- Зарегистрирован: 07 Июль 2005, 16:51
- Откуда: Москва, Россия
- Благодарил (а): 11 раз
- Поблагодарили: 32 раза
- Контактная информация:
libcurl for Clarion
Для этой задачи FormPost совершенно не к месту, простой GET запрос получает страницу:Игорь Столяров писал(а): ↑11 Август 2018, 7:02Loc:Res = Curl.FormPost(Clip(xURL_), Loc:RespBuffer)
Код: Выделить всё
res = curl.SendRequest('http://www.cbr.ru/currency_base/daily/', 'date_req=11.08.2018', respbuffer)
С уважением, ДП
- Игорь Столяров
- Ветеран движения
- Сообщения: 7447
- Зарегистрирован: 07 Июль 2005, 10:19
- Откуда: г. Ростов-на-ДоМу
- Благодарил (а): 16 раз
- Поблагодарили: 51 раз
libcurl for Clarion
Я с этого начинал. Как раз проблема засветилась на новых примерах, которые Вы анонсировали …
Стал проверять свой старый код - та же беда. Пришёл к тому, что корректно работает только FormPOST.
Можно я сброшу в личку реальный пример запроса с проблемой (там всего 2 строки запроса для проверки) ?
За теми кто отстал - не возвращаться. (С) Кодекс
- Дед Пахом
- Старичок
- Сообщения: 3143
- Зарегистрирован: 07 Июль 2005, 16:51
- Откуда: Москва, Россия
- Благодарил (а): 11 раз
- Поблагодарили: 32 раза
- Контактная информация:
libcurl for Clarion
Конечно.Игорь Столяров писал(а): ↑11 Август 2018, 11:46Можно я сброшу в личку реальный пример запроса с проблемой
С уважением, ДП
- Игорь Столяров
- Ветеран движения
- Сообщения: 7447
- Зарегистрирован: 07 Июль 2005, 10:19
- Откуда: г. Ростов-на-ДоМу
- Благодарил (а): 16 раз
- Поблагодарили: 51 раз
libcurl for Clarion
Заранее извиняюсь, если вопрос дилетантский, но таки непонятно ...
При многократном запросе GET метод Curl.SendRequest(MyUrl) начинает холявить и возвращает страницу MyUrl из кеша …
Есть ли в библиотеке LibCurl возможность сброса кеша перед запросом (аналог DeleteUrlCacheEntry(MyUrl) в WinINET API) ?
Заранее спасибо ...
При многократном запросе GET метод Curl.SendRequest(MyUrl) начинает холявить и возвращает страницу MyUrl из кеша …
Есть ли в библиотеке LibCurl возможность сброса кеша перед запросом (аналог DeleteUrlCacheEntry(MyUrl) в WinINET API) ?
Заранее спасибо ...
За теми кто отстал - не возвращаться. (С) Кодекс
- Дед Пахом
- Старичок
- Сообщения: 3143
- Зарегистрирован: 07 Июль 2005, 16:51
- Откуда: Москва, Россия
- Благодарил (а): 11 раз
- Поблагодарили: 32 раза
- Контактная информация:
libcurl for Clarion
Игорь Столяров писал(а): ↑14 Август 2018, 9:43звращает страницу MyUrl из кеша
В общем, я бы для начала передал в заголовке Cache-Control: "no-cache", чтобы сервер обновлял данные.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.
С уважением, ДП
- Игорь Столяров
- Ветеран движения
- Сообщения: 7447
- Зарегистрирован: 07 Июль 2005, 10:19
- Откуда: г. Ростов-на-ДоМу
- Благодарил (а): 16 раз
- Поблагодарили: 51 раз
libcurl for Clarion
Добавил конструкцию
Но всё равно, что-то не очень понятное происходит.
Не могу поймать устойчивую комбинацию, возможно, это эпизодически козлит запрашиваемый сервис.
Код: Выделить всё
Curl.FreeHttpHeaders()
Curl.AddHttpHeader('Cache-Control: no-cache')
If Curl.SetHttpHeaders() <> CURLE_OK.
Не могу поймать устойчивую комбинацию, возможно, это эпизодически козлит запрашиваемый сервис.
За теми кто отстал - не возвращаться. (С) Кодекс
- Игорь Столяров
- Ветеран движения
- Сообщения: 7447
- Зарегистрирован: 07 Июль 2005, 10:19
- Откуда: г. Ростов-на-ДоМу
- Благодарил (а): 16 раз
- Поблагодарили: 51 раз
libcurl for Clarion
Парадокс LibCurl в том, что чем больше я его настраиваю - тем хуже он работает.
Запутавшись в окончательно в параметрах и описаниях - убрал вообще всё до by default … и наконец-то оно заработало !
Кстати, в примерах есть маленький косяк-с.
Процедура SendHTTPRequest в TestHTTP.APP
Запутавшись в окончательно в параметрах и описаниях - убрал вообще всё до 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
За теми кто отстал - не возвращаться. (С) Кодекс
- Дед Пахом
- Старичок
- Сообщения: 3143
- Зарегистрирован: 07 Июль 2005, 16:51
- Откуда: Москва, Россия
- Благодарил (а): 11 раз
- Поблагодарили: 32 раза
- Контактная информация:
libcurl for Clarion
Есть такое. Правда, примеры к 6-ке я особо не проверяю, собираются, работают - и ладно.Игорь Столяров писал(а): ↑14 Август 2018, 21:05Кстати, в примерах есть маленький косяк-с.
С уважением, ДП
- Игорь Столяров
- Ветеран движения
- Сообщения: 7447
- Зарегистрирован: 07 Июль 2005, 10:19
- Откуда: г. Ростов-на-ДоМу
- Благодарил (а): 16 раз
- Поблагодарили: 51 раз
libcurl for Clarion
Ввиду полного отсутствия описания к LibCurl, все примеры - это очень полезный учебный материал.
За теми кто отстал - не возвращаться. (С) Кодекс
- Дед Пахом
- Старичок
- Сообщения: 3143
- Зарегистрирован: 07 Июль 2005, 16:51
- Откуда: Москва, Россия
- Благодарил (а): 11 раз
- Поблагодарили: 32 раза
- Контактная информация:
- Игорь Столяров
- Ветеран движения
- Сообщения: 7447
- Зарегистрирован: 07 Июль 2005, 10:19
- Откуда: г. Ростов-на-ДоМу
- Благодарил (а): 16 раз
- Поблагодарили: 51 раз
libcurl for Clarion
Это я знаю … даже читаю. Иногда.
Но как бы понятней, то что ближе к объекту обсуждения на форуме.
И реализация классов для Clarion. Поэтому учимся по примерам.
Но как бы понятней, то что ближе к объекту обсуждения на форуме.
И реализация классов для Clarion. Поэтому учимся по примерам.
За теми кто отстал - не возвращаться. (С) Кодекс
- Игорь Столяров
- Ветеран движения
- Сообщения: 7447
- Зарегистрирован: 07 Июль 2005, 10:19
- Откуда: г. Ростов-на-ДоМу
- Благодарил (а): 16 раз
- Поблагодарили: 51 раз
libcurl for Clarion
Добрый день !
Можно ли мечтать о методе:
но с передачей параметров pPostFields, т.е. аналогично традиционному запросу:
Cейчас при вызове FormPost прикручиваю параметры к строке pUrl через "?", что не совсем правильно ...
Заранее спасибо за рассмотрение вопроса !
Можно ли мечтать о методе:
Код: Выделить всё
FormPost PROCEDURE(STRING pUrl, *IDynStr pDynStr, <curl::ProgressDataProcType xferproc>), CURLcode, PROC
Код: Выделить всё
SendRequest PROCEDURE(STRING pUrl, <STRING pPostFields>, *IDynStr pDynStr, <curl::ProgressDataProcType xferproc>), CURLcode, PROC
Заранее спасибо за рассмотрение вопроса !
За теми кто отстал - не возвращаться. (С) Кодекс