عميل HTTP بلغة C++: إجراء الطلبات بشكل صحيح من الألف إلى الياء

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

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

ابدأ الدورة

عميل HTTP بلغة C++: إجراء الطلبات بشكل صحيح من الألف إلى الياء

\n\n

في عالم تطوير البرمجيات الحديث، القدرة على التفاعل مع الخوادم البعيدة عبر HTTP هي مهارة أساسية. سواء كان الأمر يتعلق بتنزيل البيانات من API، أو إرسال النماذج، أو العمل مع خدمات الويب، توفر لغة C++ عدة أدوات قوية لإنشاء عملاء HTTP. في هذه المقالة، سنشرح كيفية إجراء طلبات HTTP بشكل صحيح بلغة C++، وسنستعرض المكتبات الشائعة ونكتب أمثلة عملية على الكود.

\n\n

لماذا C++ لطلبات HTTP؟

\n\n

لا تحتوي لغة C++ على دعم مدمج لـ HTTP في المكتبة القياسية، على عكس Python أو JavaScript. ومع ذلك، هذه ليست مشكلة: فهناك مكتبات مجربة عبر الزمن تسمح بإرسال الطلبات بسهولة وكفاءة. الخيارات الرئيسية هي:

\n\n
    \n
  • libcurl (cURL) — المكتبة الأكثر شيوعاً عبر المنصات.
  • \n
  • Boost.Beast — مكتبة حديثة مبنية على Boost.Asio.
  • \n
  • WinHTTP — حل مدمج لنظام Windows.
  • \n
  • Qt Network — للمشاريع التي تستخدم Qt.
  • \n
\n\n

في هذه المقالة، سنركز على الأولين، حيث أنهما الأكثر شمولاً ومناسبان لمعظم المهام.

\n\n

1. عميل HTTP باستخدام libcurl

\n\n

libcurl هي مكتبة مجربة لسنوات، تدعم HTTP وHTTPS وFTP والعديد من البروتوكولات الأخرى. إنها سهلة الاستخدام وموثقة بشكل ممتاز.

\n\n

تثبيت libcurl

\n\n

لنظام Linux (Ubuntu/Debian):

\n
sudo apt-get install libcurl4-openssl-dev
\n\n

لنظام Windows، يمكنك تنزيل الملفات الثنائية المجمعة مسبقاً من الموقع الرسمي curl.se أو استخدام vcpkg:

\n
vcpkg install curl
\n\n

طلب GET بسيط

\n\n

لنكتب مثالاً أساسياً لجلب البيانات من الخادم:

\n\n
#include <iostream>\n#include <string>\n#include <curl/curl.h>\n\n// دالة رد الاتصال لكتابة البيانات\nstatic size_t WriteCallback(void* contents, size_t size, size_t nmemb, std::string* output) {\n    size_t totalSize = size * nmemb;\n    output->append((char*)contents, totalSize);\n    return totalSize;\n}\n\nint main() {\n    CURL* curl = curl_easy_init();\n    if (!curl) {\n        std::cerr << "خطأ في تهيئة CURL" << std::endl;\n        return 1;\n    }\n\n    std::string response;\n    curl_easy_setopt(curl, CURLOPT_URL, "https://jsonplaceholder.typicode.com/posts/1");\n    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback);\n    curl_easy_setopt(curl, CURLOPT_WRITEDATA, &response);\n    curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L); // تعطيل التحقق من SSL للاختبار\n\n    CURLcode res = curl_easy_perform(curl);\n    if (res != CURLE_OK) {\n        std::cerr << "خطأ في الطلب: " << curl_easy_strerror(res) << std::endl;\n    } else {\n        std::cout << "رد الخادم:\\n" << response << std::endl;\n    }\n\n    curl_easy_cleanup(curl);\n    return 0;\n}
\n\n

يجب الترجمة مع العلم -lcurl:

\n
g++ -o http_client http_client.cpp -lcurl
\n\n

طلب POST مع إرسال JSON

\n\n

الآن سنضيف إرسال البيانات:

\n\n
#include <iostream>\n#include <string>\n#include <curl/curl.h>\n\nint main() {\n    CURL* curl = curl_easy_init();\n    if (!curl) return 1;\n\n    std::string response;\n    std::string jsonData = R"({"title": "foo", "body": "bar", "userId": 1})";\n\n    struct curl_slist* headers = nullptr;\n    headers = curl_slist_append(headers, "Content-Type: application/json");\n\n    curl_easy_setopt(curl, CURLOPT_URL, "https://jsonplaceholder.typicode.com/posts");\n    curl_easy_setopt(curl, CURLOPT_POSTFIELDS, jsonData.c_str());\n    curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);\n    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCal                

المدونات

توصيات الكتب