- выгрузка файлов с сервера
- загрузка файлов на сервер
- HTTP GET/POST с возможностью прочитать ответ сервера
- Поддержка SSL
Тестировал на протоколах http, https, ftp, sftp, ftpes.
Краткий туториал в файле \doc\How-To.txt.
Модератор: Дед Пахом
Дед Пахом
Игорь, сделал (FormPost(STRING pUrl, *IDynStr pDynStr, <curl::ProgressDataProcType xferproc>)), но не проверял, сообщи результат, тогда выложу на GitHub.Игорь Столяров писал(а): 09 Август 2018, 18:59Возможно ли сделать вариант метода Curl.FormPostStr() с типом данных для строки с ответом *IDynStr ?
Как в методе Curl.SendRequest. Просто неизвестно какого размера будет строка с ответом на запрос ...
Дед Пахом
Игорь Столяров
Спасибо, проверил всё прекрасно работает. По крайне мере на моих примерах проблем нет.Дед Пахом писал(а): 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
Игорь Столяров
Для этой задачи FormPost совершенно не к месту, простой GET запрос получает страницу:
Код: Выделить всё
res = curl.SendRequest('http://www.cbr.ru/currency_base/daily/', 'date_req=11.08.2018', respbuffer)
Дед Пахом
Я с этого начинал.
Игорь Столяров
Конечно.Игорь Столяров писал(а): 11 Август 2018, 11:46Можно я сброшу в личку реальный пример запроса с проблемой
Дед Пахом
Игорь Столяров
В общем, я бы для начала передал в заголовке 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.
Дед Пахом
Код: Выделить всё
Curl.FreeHttpHeaders()
Curl.AddHttpHeader('Cache-Control: no-cache')
If Curl.SetHttpHeaders() <> CURLE_OK.
Игорь Столяров
Код: Выделить всё
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
Игорь Столяров
Есть такое. Правда, примеры к 6-ке я особо не проверяю, собираются, работают - и ладно.
Дед Пахом
Ввиду полного отсутствия описания к LibCurl, все примеры - это очень полезный учебный материал.
Игорь Столяров
Дед Пахом
Игорь Столяров
Код: Выделить всё
FormPost PROCEDURE(STRING pUrl, *IDynStr pDynStr, <curl::ProgressDataProcType xferproc>), CURLcode, PROC
Код: Выделить всё
SendRequest PROCEDURE(STRING pUrl, <STRING pPostFields>, *IDynStr pDynStr, <curl::ProgressDataProcType xferproc>), CURLcode, PROC
Игорь Столяров
Создано на основе phpBB® Forum Software © phpBB Limited
Time: 0.071s | Peak Memory Usage: 1.37 МБ | GZIP: Off