Страница 15 из 30
libcurl for Clarion
Добавлено: 09 Август 2018, 19:22
Дед Пахом
Игорь Столяров писал(а): ↑09 Август 2018, 18:59Возможно ли сделать вариант метода Curl.FormPostStr() с типом данных для строки с ответом *IDynStr ?
Как в методе Curl.SendRequest. Просто неизвестно какого размера будет строка с ответом на запрос ...
Игорь, сделал (
FormPost(STRING pUrl, *IDynStr pDynStr, <curl::ProgressDataProcType xferproc>)), но не проверял, сообщи результат, тогда выложу на GitHub.
libcurl for Clarion
Добавлено: 09 Август 2018, 20:01
Игорь Столяров
Спасибо ! Оттестюсь и сообщу (пара дней).
libcurl for Clarion
Добавлено: 11 Август 2018, 7:02
Игорь Столяров
Дед Пахом писал(а): ↑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) работает без этой проблемы многие годы.
Заранее спасибо за наводку ...
libcurl for Clarion
Добавлено: 11 Август 2018, 11:19
Дед Пахом
Игорь Столяров писал(а): ↑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)
libcurl for Clarion
Добавлено: 11 Август 2018, 11:46
Игорь Столяров
Дед Пахом писал(а): ↑11 Август 2018, 11:19простой GET запрос получает страницу
Я с этого начинал.
Как раз проблема засветилась на новых примерах, которые Вы анонсировали …
Стал проверять свой старый код - та же беда.
Пришёл к тому, что корректно работает только FormPOST.
Можно я сброшу в личку реальный пример запроса с проблемой (там всего 2 строки запроса для проверки) ?
libcurl for Clarion
Добавлено: 11 Август 2018, 11:48
Дед Пахом
Игорь Столяров писал(а): ↑11 Август 2018, 11:46Можно я сброшу в личку реальный пример запроса с проблемой
Конечно.
libcurl for Clarion
Добавлено: 14 Август 2018, 9:43
Игорь Столяров
Заранее извиняюсь, если вопрос дилетантский, но таки непонятно ...
При многократном запросе GET метод Curl.SendRequest(MyUrl) начинает холявить и возвращает страницу MyUrl из кеша …
Есть ли в библиотеке LibCurl возможность сброса кеша перед запросом (аналог DeleteUrlCacheEntry(MyUrl) в WinINET API) ?
Заранее спасибо ...
libcurl for Clarion
Добавлено: 14 Август 2018, 10:01
Дед Пахом
Игорь Столяров писал(а): ↑14 Август 2018, 9:43звращает страницу MyUrl из кеша
В общем, я бы для начала передал в заголовке Cache-Control: "no-cache", чтобы сервер обновлял данные.
libcurl for Clarion
Добавлено: 14 Август 2018, 11:08
Игорь Столяров
Добавил конструкцию
Код: Выделить всё
Curl.FreeHttpHeaders()
Curl.AddHttpHeader('Cache-Control: no-cache')
If Curl.SetHttpHeaders() <> CURLE_OK.
Но всё равно, что-то не очень понятное происходит.
Не могу поймать устойчивую комбинацию, возможно, это эпизодически козлит запрашиваемый сервис.
libcurl for Clarion
Добавлено: 14 Август 2018, 21:05
Игорь Столяров
Парадокс 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
libcurl for Clarion
Добавлено: 14 Август 2018, 21:32
Дед Пахом
Игорь Столяров писал(а): ↑14 Август 2018, 21:05Кстати, в примерах есть маленький косяк-с.
Есть такое. Правда, примеры к 6-ке я особо не проверяю, собираются, работают - и ладно.
libcurl for Clarion
Добавлено: 14 Август 2018, 21:50
Игорь Столяров
Дед Пахом писал(а): ↑14 Август 2018, 21:32примеры к 6-ке я особо не проверяю
Ввиду полного отсутствия описания к LibCurl, все примеры - это очень полезный учебный материал.
libcurl for Clarion
Добавлено: 14 Август 2018, 22:36
Дед Пахом
Игорь Столяров писал(а): ↑14 Август 2018, 21:50Ввиду полного отсутствия описания к LibCurl
А это что
https://curl.haxx.se/libcurl/?
libcurl for Clarion
Добавлено: 15 Август 2018, 0:51
Игорь Столяров
Это я знаю … даже читаю. Иногда.
Но как бы понятней, то что ближе к объекту обсуждения на форуме.
И реализация классов для Clarion. Поэтому учимся по примерам.
libcurl for Clarion
Добавлено: 16 Август 2018, 6:45
Игорь Столяров
Добрый день !
Можно ли мечтать о методе:
Код: Выделить всё
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 через "?", что не совсем правильно ...
Заранее спасибо за рассмотрение вопроса !