ما هي مكتبة libcurl ولماذا تحتاجها
libcurl هي مكتبة قوية ومتعددة المنصات تُستخدم على نطاق واسع لنقل البيانات عبر بروتوكولات الشبكة المختلفة. مكتوبة بلغة C، وتوفر واجهة C++ (غالبًا ما تُسمى curlpp أو مجرد غلاف libcurl) لتنفيذ طلبات HTTP، وتنزيل الملفات، والعمل مع FTP وSMTP والعديد من البروتوكولات الأخرى. في سياق C++، تُعتبر libcurl المعيار الفعلي لإنشاء عملاء HTTP.
لماذا تحتاج libcurl في C++؟
- التعامل مع REST API: إرسال طلبات GET و POST و PUT و DELETE إلى خدمات الويب.
- تنزيل الملفات: تحميل الصور والمستندات والملفات المضغوطة من الإنترنت.
- إرسال البيانات: رفع الملفات إلى الخادم وإرسال النماذج.
- تحليل صفحات الويب: الحصول على كود HTML لتحليله لاحقًا.
- المصادقة: دعم Basic و Digest و OAuth و NTLM وغيرها من المخططات.
- التعامل مع الكوكيز: إدارة الجلسات والحالة.
- SSL/TLS: اتصال آمن عبر HTTPS.
تتميز المكتبة بأداء عالٍ واستقرار ودعم لجميع بروتوكولات الشبكة الحديثة تقريبًا. تُستخدم في مشاريع مثل cURL (سطر الأوامر) و PHP (امتداد cURL) والعديد من المشاريع الأخرى.
تثبيت libcurl لـ C++
على عكس Python أو JavaScript، لا يوجد في C++ مدير حزم موحد، لذا يعتمد التثبيت على نظام التشغيل والمُجمّع (compiler) لديك.
التثبيت على Linux (Ubuntu/Debian)
sudo apt update
sudo apt install libcurl4-openssl-dev
للتوزيعات الأخرى (Fedora, CentOS, Arch) استخدم مدير الحزم المناسب (dnf, yum, pacman).
التثبيت على macOS
brew install curl
التثبيت على Windows
أسهل طريقة هي استخدام vcpkg:
git clone https://github.com/Microsoft/vcpkg.git
cd vcpkg
.\bootstrap-vcpkg.bat
.\vcpkg integrate install
.\vcpkg install curl
أو قم بتنزيل الملفات الثنائية المُجمّعة مسبقًا من الموقع الرسمي لـ curl.
الربط في مشروع CMake
find_package(CURL REQUIRED)
target_link_libraries(your_project PRIVATE CURL::libcurl)
بداية سريعة: طلب HTTP GET بسيط
لنكتب برنامجًا بسيطًا يقوم بتنفيذ طلب GET إلى موقع ويب ويعرض البيانات المستلمة.
#include <iostream>
#include <string>
#include <curl/curl.h>
// دالة رد الاتصال لكتابة البيانات في سلسلة نصية
size_t WriteCallback(void* contents, size_t size, size_t nmemb, std::string* output) {
size_t totalSize = size * nmemb;
output->append(static_cast<char*>(contents), totalSize);
return totalSize;
}
int main() {
CURL* curl;
CURLcode res;
std::string response;
curl_global_init(CURL_GLOBAL_DEFAULT);
curl = curl_easy_init();
if (curl) {
curl_easy_setopt(curl, CURLOPT_URL, "https://api.github.com");
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &response);
// تنفيذ الطلب
res = curl_easy_perform(curl);
if (res != CURLE_OK) {
std::cerr << "خطأ: " << curl_easy_strerror(res) << std::endl;
} else {
std::cout << "رد الخادم:" << std::endl;
std::cout << response << std::endl;
}
curl_easy_cleanup(curl);
}
curl_global_cleanup();
return 0;
}
التجميع (Compilation):
g++ -o http_client http_client.cpp -lcurl