Темы блога относятся к программированию на языке С++
В основном для C++Qt (Qt5.1) и C++ Builder (RAD 2009 и RAD XE3)
В основном для C++Qt (Qt5.1) и C++ Builder (RAD 2009 и RAD XE3)
Библиотека libcurl в С++ для работы по HTTP
Цитата:
libcurl это свободная и простая в использовании клиентская библиотека по передачи данных по URL, она поддерживает DICT, FILE, FTP, FTPS, GOPHER, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, POP3, POP3S, RTMP, RTSP, SCP, SFTP, SMTP, SMTPS, TELNET и TFTP. Также libcurl имеет поддержку SSL сертификатов, HTTP POST, HTTP PUT, FTP загрузку, HTTP form загрузку, proxy, cookies, user+password авторизацию (Basic, Digest, NTLM, Negotiate, Kerberos), докачивания файлов, http прокси туннелирования и многого другого!
libcurl легко переносима, она собирается и работает на многих платформах, включая Solaris, NetBSD, FreeBSD, OpenBSD, Darwin, HPUX, IRIX, AIX, Tru64, Linux, UnixWare, HURD, Windows, Amiga, OS/2, BeOs, Mac OS X, Ultrix, QNX, OpenVMS, RISC OS, Novell NetWare, DOS и остальные... libcurl свободна, потокобезопасна, совместима с IPv6, функциональна, имеет хорошую поддержку, быстрая, тщательно задокументирована и уже используется во многих известных, крупных и успешных компаний и в многочисленных приложениях.[2] 1. Установка библиотеки. 2. Основные принципы. 3. Простой пример. 4. Заголовки. 5. Обработка ошибок. 6. Загрузка в буфер 7. Загрузка в файл. 8. Перенаправление (редерикт). 9. Cookie. 10. Преобразование в URL вид. 11. POST-запрос для авторизации на форуме. 12. Получение страниц в сжатом виде. 13. Передача с использованием HTTPs (расширение протокола HTTP, поддерживающее шифрование). Исходники. Литература. Темы. 1 Установка библиотеки Ubuntu Linux Достаточно стандартно выполнить команду
1. Заходим на сайт http://curl.haxx.se/download.html. Качаем версию библиотеки для Win32 - MSVC http://curl.haxx.se/download/l... l-msvc.zip 2. Распаковываем архив берем от туда все dll- файлы:
Примечание: На данный момент ссылки стали нерабочими, нужно качать исходники и собирать самому из исходников в MSVC. Но если влом - используйте библиотеки что в примерах (в архиве прикреплены). 3. Так же берем curllib.lib из папки .\libcurl-7.19.3-win32-ssl-msvc\lib\Release Если у вас MSVC++ используем его, если С++Builder конвертируем файл curllib.lib в curllib-bcb.lib утилитой coff2omf.exe Код:
coff2omf curllib.lib curllib-bcb.lib
2. Основные принципы cUrl предоставляет несколько интерфейсов:
Цитата:
При использовании в libcurl "простого" интерфейса вы инициализируете сеанс и получаете handle (часто упоминается как "easy handle"), который вы используете в качестве аргумента в функциях Easy интерфейса. Используйте curl_easy_init, чтобы получить handle.
После получения вы должны установить все нужные параметры в предстоящей передаче, наиболее важным среди которых является URL (передавать что-то без заданного URL невозможно). Вы можете задавать различные функции обратного вызова, которые будут вызываться из библиотеки, при получении данных и т.д. Для всего этого используется curl_easy_setopt.[2] Цитата:
После того как все настройки окончены, вы сообщаете libcurl выполнение передачи с помощью curl_easy_perform. Она проделает все операции и вернет результат своей работы типа перечисления CURLcode.
После передачи, вы можете установить новые настройки и сделать еще передачу, или, если вы уже закончили, вызовите очистку сессии curl_easy_cleanup. Если вы хотите иметь постоянное подключение, не освобождайте handle сразу, вместо этого выполните другие передачи с использованием этого же handle. Никогда не используйте один и тот же хендл в разных потоках! (можно сделать синхронизацию, но это сведёт на нет плюсы многопоточности)[2] 3. Простой пример
Каждому вызову такой ф-ции должен соответствовать вызов ф-ции
Опция CURLOPT_URL относится NETWORK-опциям и задает url- адрес. Этот параметр должен иметь вид согласно RFC 3986 формата: "scheme://host:port/path" (смотри также Преобразование в URL вид.)
4. Заголовки. Заголовки запроса можно также установить с помощью опций, но в зависимости от версии libcurl, константы определяющие опции могут отличаться.
5. Обработка ошибок. В случае возникновения ошибки при выполнении функции curl_easy_perform() можно получить её описание с помощью:
По умолчанию curl выводит данные в stdout т.е. в окно консоли. Для того что бы сохранить данные в отдельном буфере нужно указать этот буфер в опции CURLOPT_WRITEDATA и callback функцию которая будет записывать туда данные при их приёме с помощью опции CURLOPT_WRITEFUNCTION. Функция должна иметь вид:
size_t size - размер принимамого блока данных size_t nmemb - общее количество блоков данных. void* userdata - это параметр опции CURLOPT_WRITEDATA, в который производится запись - наш буфер. Функция должна возвращать количество обработанных байт ( size*nmemb ). Если это количество будет отличаться от суммы, полученной на входе вашей функции, то будет отдан сигнал об ошибке в библиотеке. Это можно использовать для прервания передачи, с возвращемым значением CURLE_WRITE_ERROR. Функция может вернуть значение CURL_WRITEFUNC_PAUSE, которое приведет к приостановке записи в этом соединении. В качестве буфера можно использовать контейнер или поток STL что упростит задачу. Для примера использование std::string :
Следующий пример показывает как можно сохранить тело ответа сервера в один в файл, а заголовок в другой.
Для автоматического перехода на перенаправляемую страницу необходимо установить опцию CURLOPT_FOLLOWLOCATION в 1
её параметр указывает их максимальное количество
Далее описание опций для работы с Cookie CURLOPT_COOKIE
Формат строки должен быть вида name=contents, где name имя cookie, а contents- её содержание. Используется, когда вы хотите указать точное содержание cookie-заголовоков для отправки на сервер. Если нужно передать несколько cookie, то строка должна выглядеть как "name1 = content1; name2 = content2;" и т. д. CURLOPT_COOKIEFILE
Сookies должны хранится в формате куков Netscape/Mozilla или в обычном HTTP-стиле заголовков (Set-Cookie: ...) помещенных в файл. Если указать несуществующий файл или пустую строку (""), то это разрешит libcurl полученные использовать cookie в следующих запросах для данного дескриптора curl Можно несколько раз устанавливать эту опцию для загрузки нескольких файлов с куками. CURLOPT_COOKIEJAR
Если файл не может быть создан или сохранен libcurl не выдаст ошибку. Использование опций CURLOPT_VERBOSE или CURLOPT_DEBUGFUNCTION вызовет вывод предупреждения. CURLOPT_COOKIESESSION
CURLOPT_COOKIELIST
Если задать параметр "ALL" то все cookies будут очищены , если "FLUSH" будут сохранены в файл указанный в опции CURLOPT_COOKIEJAR Для вывода информации о cookie можно воспользоваться функцией из примера cookie_interface.c
Иногда возникает необходимость передавать GET/POST запросы параметры которые содержать в себе символы требующие "экранирования" ( кириллица, символ "@" ). К примеру необходимо выполнить поиск в яндексе по слову "Программирование", если посмотреть в строку браузера, то там это будет выглядеть так:
Цитата:
Эта функция преобразует входной строку в закодированную для URL строку и возвращает ее в качестве новой выделенной строки. Все входные символы, кроме a-z, A-Z или 0-9 преобразуются в их "замаскированные" версии (%NN, где NN - двузначное шестнадцатеричное число).
Если длина аргумента имеет значение 0 (ноль), curl_easy_escape использует strlen() на входной строке, чтобы вычислить размер. Вы должны освободить полученную строку с помощью curl_free, после окончания работы с ней.[2]
Цитата:
curl_free освобождает память, которая была выделена внутри функций curl. Необходимо использовать curl_free() вместо free(), чтобы избежать ошибок, которые могут возникнуть по причине возможных различий при управлении памятью в вашем приложении и curl.[2]
Код для рассматриваемого примера
Для удобства использования с std::string можно написать такую функцию
В качестве примера приведу авторизацию на cyberforum.ru с последующим переходом в "Мой кабинет", для работы примера вам необходимо указать свой e-mail и пароль. Результат выполнения программы приведен на рисунке справа.
1. Для успешной авторизации и перехода по страницам нужно:
2. По умолчанию libcurl использует GET "режим" отправки запросов, после установки опции CURLOPT_POSTFIELDSIZE он переключается на POST, поэтому для осуществление последующего GET нужно переключить режим на GET:
12. Получение страниц в сжатом виде.
Для работы с по протоколу HTTPs необходимо что бы libcurl была собрана с поддержкой SSL, а также необходимы соответствующие dll-ки ( из OpenSSL ) Если библиотека собрана без SSL, то ф-ция curl_easy_perform() вернет код CURLE_UNSUPPORTED_PROTOCOL (1) "Unsupported protocol" Далее пример простого https- запроса :
PDF вариант статьи: Статья о curl.pdf (Прикреплено по просьбе пользователя reef213, составлял pdf тоже он cUrl в Dev C++) Исходники: HTTP, POST, авторизация на cyberforum (curl v7.19.3-ssl, C++Builder XE3).rar HTTP, GET, (curl v7.22.0, g++ 4.6.3, Makefile, Ubuntu x32).rar HTTP, POST, авторизация на cyberforum(curl v7.22.0, Qt5, Ubuntu x32).zip Литература: 1. http://curl.haxx.se/ 2. http://ru.libcurl.wikia.com/wi... 0%BA%D0%B8 3. cURL | System Development Блоги : Подключение Curl библиотеки. QtCreator, MinGW32, Windows Темы : 1. Скачивание из интернета 2. Builder и curl 3. Замена строки 4. Опять кодировки 5. Работа с CURL 6. Curl без ssl или статическая линковка 7. Curl с нуля |
Всего комментариев 17
Комментарии
-
Цитата:В папку с исполняемым файлом как и в других средах разработки.
Да хорошая статья! Молодец! Все хорошо расписал! Благодаря ей я быстро разобрался и сделал авторизацию для контакта и можно по страницам шарить, тут идея возникла написать программку для рассылки сообщений для вк, попробовать хотябы, мб и получиться.Запись от ninja2 размещена 30.09.2013 в 07:16 -
DLL-ки должны лежать рядом с исполняемым файлом *.EXE запускаемой программы.
Что касается
Цитата:У меня визуал студио 2010.
Кроме того есть С++обвертки для работы с сurl что должно быть более удобным в использовании чем сама curlЗапись от Avazart размещена 01.10.2013 в 00:12 -
Цитата:DLL-ки должны лежать рядом с исполняемым файлом *.EXE запускаемой программы.
Запись от ninja2 размещена 02.10.2013 в 20:54 -
Ну обычно есть две сборки статическая ( статический *.lib) и динамическая ( *.lib-импорта + *.dll ).
Если сборка статическая то "код" используемых ф-ций как бы включается в *.exe программы.
Если динамическая то ф-ции импортируются из *.dll во время запуска, что бы знать программе "как" их импортировать нужен *.lib-импорта.Запись от Avazart размещена 05.10.2013 в 21:56 -
Я извиняюсь, но я, что то ни в одной ссылке не нашел curllib.lib
.dll есть, а вот либ нет. Вы не дадите точную ссылку?Запись от Dr.Xank размещена 18.11.2014 в 20:23 -
Запись от Avazart размещена 29.01.2015 в 18:40 -
Интересная штукенция. Пользователи: 1С, адобы, CERN, гуглы с трубой, IBM, LG и т.д. и т.п. Надо будет тоже воспользоваться.
Запись от svetogor размещена 24.02.2017 в 21:59 -
Здравствуйте,
Я правильно понимаю,что описание установки устарело ?
У меня нет такого файла, есть такой - libcurl_a.lib в папке:C++ 1
Так же берем curllib.lib из папки .\libcurl-7.19.3-win32-ssl-msvc\lib\Release
Но при это все равно возникает ошибка:C++ 1
C:\curl-7.64.1\builds\libcurl-vc16-x86-release-static-ipv6-sspi-winssl\lib
C++ 1 2
Ошибка LNK2019 ссылка на неразрешенный внешний символ __imp__curl_easy_init в функции _main LibCurl proba C:\Users\Optimus\source\repos\LibCurl proba\LibCurl proba\LibCurl proba.obj 1 Ошибка LNK1120 неразрешенных внешних элементов: 1 LibCurl proba C:\Users\Optimus\source\repos\LibCurl proba\Debug\LibCurl proba.exe 1
Запись от Optimus11 размещена 02.05.2019 в 17:09 -
Запись от Avazart размещена 30.09.2019 в 20:29 -
А где именно в архиве dll-файлы?
качал это https://curl.haxx.se/download/curl-7.71.1.tar.gzЗапись от polakware размещена 03.08.2020 в 19:18 -
polakware, это архив с исходниками, его собирать надо. А в конце страницы https://curl.haxx.se/download.html - ссылки на готовые библиотеки для Windows (по алфавиту)
Запись от Black Fregat размещена 04.08.2020 в 05:00 -
Цитата:polakware, это архив с исходниками, его собирать надо. А в конце страницы https://curl.haxx.se/download.html - ссылки на готовые библиотеки для Windows (по алфавиту)Код:
Серьезность Код Описание Проект Файл Строка Состояние подавления Ошибка LNK2019 ссылка на неразрешенный внешний символ curl_easy_init в функции main CURLTest C:\Users\dkari\source\repos\CURLTest\CURLTest\main.obj 1
В чем проблема? Проект на х64C++ 1 2 3 4 5 6 7 8 9 10 11 12
#define CURL_STATICLIB #pragma comment( lib, "ws2_32.lib" ) #pragma comment( lib, "Wldap32.lib" ) #pragma comment (lib, "libcurl_a.lib") #include <iostream> #include <curl/curl.h> int main() { CURL* curl; curl = curl_easy_init(); }
Запись от polakware размещена 04.08.2020 в 07:17 -
Запись от Avazart размещена 05.08.2020 в 20:31
Обновил(-а) Avazart 05.08.2020 в 20:33 -
Цитата:Для работы с по протоколу HTTPs необходимо что бы libcurl была собрана с поддержкой SSL, а также необходимы соответствующие dll-ки ( из OpenSSL )
Запись от Optimus11 размещена 03.03.2021 в 23:07 -
Запись от Avazart размещена 03.03.2021 в 23:41 -
Не совсем понятно по пункту 11. POST-запрос для авторизации на форуме:
В коде вы устанавливаете опцию CURLOPT_POSTFIELDS, но я нигде не вижу, чтобы была вызвана опция CURLOPT_POST до вызова curl_easy_perform. По умолчанию используется метод GET и он ни как не соотносится с опцией CURLOPT_POSTFIELDS.
Это неточность в примере ?Запись от Optimus11 размещена 08.12.2021 в 00:19 -
Далее по тексту:
Цитата:2. По умолчанию libcurl использует GET "режим" отправки запросов, после установки опции CURLOPT_POSTFIELDSIZE он переключается на POST, поэтому для осуществление последующего GET нужно переключить режим на GET:Запись от Avazart размещена 08.12.2021 в 11:33
Обновил(-а) Avazart 08.12.2021 в 13:16