- выгрузка файлов с сервера
- загрузка файлов на сервер
- 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