Описание кросс-платформенной - CurlCross
Скачать код
Методы библиотеки
Работа с Cookie
Особенности в Linux
Особенности в Windows
Демо программа
Обновления
Описание библиотеки CurlCross
Libcurl довольно популярный и надежный инструмент. В нем есть поддержка протоколов HTTP/HTTPS. В нем также удобно работать с Cookie и редиректами. Страница проекта https://curl.haxx.se/libcurl/. Для Libcurl уже есть библиотека в FPC, сейчас подключается только в ОС Линукс. Для Windows существуют библиотека FPC с официального сайта проекта Libcurl. Но пока не было универсальной кросс-платформенной библиотеки FPC для GET/POST. Решено написать кросс-платформенную обёртку. Для этого использованы эти разные реализации и объединены в одну универсальную. К сожалению эти обёртки уже прилично устарели и многие возможности просто не реализованы, но для выполнения GET- POST-запросов и работы с куками - вполне достаточно.
Код CurlCross
Скачайте библиотеку CurlCross (700кб, FPC 3.0). Архив содержит пример CurlCross (папка example) и файлы библиотек FreePascal (папка lib), скомпилированный Libcurl для Windows 64 bit. Для Windows 32 bit можете скачать вот этот набор файлов. Можно скопировать файл libcurl.dll в системную папку Windows /system32, чтобы библиотека подключалась оттуда.
Основная подключаемая библиотека называется curlcross.pas, это необходимо прописывать в uses вашего проекта.
Методы библиотеки
CurlCross содержит 2 функции, это crossget для GET и crosspost для POST запросов:
function crossget(url,cook:string; var err,data,newcook:string; redir:boolean=TRUE):boolean;
При успешном выполнении функция crossget возвращает TRUE, FALSE при ошибках
url это адрес страницы (http/https)
cook - строка cookie в формате HTTP заголовка
err - содержит текст ошибки, если ошибок нет то переменная пуста
data - содержит код страницы, текст ответа
newcook - возвращает содержимое куков в формате HTTP заголовка
redir - указывает, что Libcurl будет следовать по перенаправлениям, по умолчанию включено (TRUE)
function crosspost(url,cook,post:string; var err,data,newcook:string; redir:boolean = TRUE):boolean;
Функция делает почти тоже самое что и crossget, но имеет переменную post для отправки POST-данных.
Функция dowrite вспомогательная, необходима для приема данных и используется предыдущими двумя функциями. В коде функции вы можете осуществить настройку параметров работы библиотеки, такие как таймауты подключения, тип запроса, компрессия файлов (по умолчанию включен GZIP). Вы можете указывать различные параметры в Headers (user-agent, формат файла и т.д.). В разных ОС подключаются разные библиотеки: в Linux стандартная libcurl из пакета FPC, для Windows использована библиотека, которую я нашел на ГитХабе https://github.com/Ruzzz/CurlPas и внесены некоторыми дополнения в код. Какие были исправления? В основном с названием функции в файле Curl_h. Они различаются от тех что сейчас есть в файле libcurl.dll. Например, было в описании Сurl_global_init, а в файле curl_global_init, т.е. был прописан с заглавной буквой, но в Си оба названия являются разными. В итоге функция не запускается и программа завершается ошибкой. Не все названия функций были исправлены, только те что необходимы для CurlCross.
Работа с Cookie
В запросе содержимое cookie возвращается не во внутреннем формате libcurl. Cookie конвертируется в шаблон, как те что в HTTP-заголовках, т.е. param1=texttexttext;
Особенности в Linux
Для установки Libcurl в ОС Debian/Ubuntu используется команда:
sudo apt-get install libcurl3
Сообщение APT если пакет уже установлен:
Для установки Libcurl в ОС RedHat/Centos/Fedora используется команда YUM с правами пользователя root:
yum install libcurl
Однако при компиляции проекта в ОС RedHat/Centos/Fedora может возникнуть ошибка:
/usr/bin/ld: warning: link.res contains output sections; did you forget -T?
/usr/bin/ld: cannot find -lcurl
Ошибка означает, что компилятору не удалось найти файл скомпилированной библиотеки libcurl.so. Это при том, что пакет библиотеки уже установлен. Она должна находиться в папке /usr/lib64/ (или /usr/lib/). На самом деле скомпилированная библиотека находится в этой папке, но называется по-другому libcurl.so.4 и libcurl.so.4.1.1 как в данном примере (в соответствии с версией библиотеки):
Есть несколько вариантов решить проблему, либо скопировать файл libcurl.so.4.1.1 в папку с программой и переименовать её, либо создать символическую ссылку на этот файл с необходимым именем. Файл libcurl.so.4 является символической ссылкой (в данной ситуации), но нам необходим "libcurl.so".
Команда для создания ссылки на библиотеку:
ln -s /usr/lib64/libcurl.so.4.1.1 /usr/lib64/libcurl.so
Здесь нужно уточнить, что ОС на которой я выполняю примеры, является 64-битной и библиотеки располагаются в 64-битной папке /usr/lib64/.
Установка из исходного кода в Debian/Ubuntu/Mint. На странице загрузки, вы можете скачать свежую версию Libcurl. На данный момент доступная версия 7.50.3, что является актуальной и рекомендуемой версией.
Особенности в Windows
Для подключения Libcurl в среде Windows необходима скомпилированная версия libcurl.dll. Данный файл уже есть в архиве CurlCross (64-битная версия с поддержкой SSL и ZLIB). Вы можете поискать другие библиотеки, либо скомпилировать самостоятельно.
Демо программа
В архиве кросс-платформенный пример для работы с HTTP GET/POST запросами. Скриншот программы:
Пример GET-запроса
procedure TForm1.Button1Click(Sender: TObject);
var
tmp,newcook,err,data:String;
begin
LabeledEdit2.Text:="";
Memo1.Text:="";
if not crossget(Edit1.Text,"",err,data,newcook,true) then
ShowMessage(err);
LabeledEdit2.Text:=newcook;
Memo1.Text:=data;
end;
Приложение необходимо скомпилировать в Лазарус (FPC 3.0). В ОС типа Linux файл libcurl.dll не нужен, он необходим только в Windows.
Обновления
2016 - В библиотеку была добавлена опция для ограничения максимального количества редиректов CURLOPT_MAXREDIRS, не более 3 редиректов по умолчанию.
2016 - Добавлена глобальная очистка свойств curl_global_cleanup.
2018 июнь - Обновлены ссылки libcurl.dll.
Art!P,
2020