libcurl في C++: دليل شامل مع أمثلة تطبيقية

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

ما هي مكتبة 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

الطرق/الدوال الأساسية في libcurl

1. curl_easy_init

توصيات