عميل 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\n1. عميل HTTP باستخدام libcurl
\n\nlibcurl هي مكتبة مجربة لسنوات، تدعم HTTP وHTTPS وFTP والعديد من البروتوكولات الأخرى. إنها سهلة الاستخدام وموثقة بشكل ممتاز.
\n\nتثبيت libcurl
\n\nلنظام Linux (Ubuntu/Debian):
\nsudo apt-get install libcurl4-openssl-dev\n\nلنظام Windows، يمكنك تنزيل الملفات الثنائية المجمعة مسبقاً من الموقع الرسمي curl.se أو استخدام vcpkg:
\nvcpkg 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:
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