Libcurl библиотека для HTTP/HTTPS на FreePascal - CurlCross

Описание кросс-платформенной - 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, чтобы библиотека подключалась оттуда. В случае ошибок, пройдите на сайт http://skanthak.homepage.t-online.de/curl.html, в архиве CAB вы сможете найти актуальную версию Libcurl.dll (32 и 64-битные версии).

Основная подключаемая библиотека называется 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