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

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

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

ابدأ الدورة

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

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



لماذا نحتاج إلى عميل HTTP بلغة C++؟

على عكس اللغات التي تحتوي على مكتبات HTTP مدمجة (Python, JavaScript)، لا تحتوي لغة C++ على أداة قياسية للعمل مع HTTP في المكتبة القياسية. ومع ذلك، هذه ليست مشكلة، حيث توجد عدة حلول قوية ومجربة عبر الزمن:

  • libcurl - المكتبة الأكثر شهرة وقوة للعمل مع عناوين URL
  • cpprestsdk (Casablanca) - مكتبة غير متزامنة حديثة من Microsoft
  • Boost.Beast - مكتبة مبنية على Boost.Asio للعمل على مستوى منخفض

في هذه المقالة، سنركز على libcurl و cpprestsdk، باعتبارهما الحلين الأكثر استخدامًا.



أساسيات العمل مع libcurl

libcurl هي مكتبة مجربة عبر الزمن تدعم العديد من البروتوكولات، بما في ذلك HTTP/1.1 و HTTP/2 و FTP وغيرها. وهي مكتوبة بلغة C، ولكن لها روابط ممتازة مع C++.



تثبيت libcurl

يعتمد تثبيت libcurl على نظام التشغيل الخاص بك:

# Ubuntu/Debiansudo apt-get install libcurl4-openssl-dev

# macOS (عبر Homebrew)brew install curl

# Windows (عبر vcpkg)vcpkg install curl


طلب GET بسيط باستخدام libcurl

لنبدأ بمثال أساسي - إرسال طلب GET والحصول على الرد:

#include <iostream>#include <curl/curl.h>#include <string>

// دالة الاستدعاء لكتابة البيانات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 = curl_easy_init(); if (!curl) { std::cerr << "خطأ في تهيئة CURL" << std::endl; return 1; }

std::string response; curl_easy_setopt(curl, CURLOPT_URL, "https://jsonplaceholder.typicode.com/posts/1"); curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback); curl_easy_setopt(curl, CURLOPT_WRITEDATA, &response); CURLcode 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); return 0;}


إرسال طلب POST مع البيانات

تُستخدم طلبات POST لإرسال البيانات إلى الخادم. لنلقِ نظرة على مثال مع بيانات JSON:

#include <iostream>#include <curl/curl.h>#include <string>

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 = curl_easy_init(); if (!curl) return 1;

std::string response; std::string jsonData = R"({"title": "foo", "body": "bar", "userId": 1})"; struct curl_slist* headers = nullptr; headers = curl_slist_append(headers, "Content-Type: application/json"); curl_easy_setopt(curl, CURLOPT_URL, "https://jsonplaceholder.typicode.com/posts"); curl_easy_setopt(curl, CURLOPT_POSTFIELDS, jsonData.c_str()); curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers); curl_easy_

المدونات

توصيات الكتب