عميل HTTP لـ C++: أفضل المكتبات للعمل مع الشبكة

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

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

ابدأ الدورة

عميل HTTP لـ C++: مراجعة أفضل المكتبات



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



1. libcurl — المعيار العالمي



libcurl هي المكتبة الأكثر شهرة واستخدامًا على نطاق واسع لنقل البيانات عبر بروتوكولات مختلفة، بما في ذلك HTTP/HTTPS و FTP و SMTP وغيرها الكثير. وهي مكتوبة بلغة C، ولكن لها غلاف رسمي لـ C++ (curl/curl.h). المزايا الرئيسية: دعم جميع إصدارات HTTP تقريبًا (حتى HTTP/3)، العمل مع البروكسي، المصادقة، SSL/TLS، تعدد المهام، ومجتمع ضخم.



مثال على طلب GET بسيط باستخدام libcurl:



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

size_t WriteCallback(void* contents, size_t size, size_t nmemb, std::string* buffer) { size_t totalSize = size * nmemb; buffer->append(static_cast<char*>(contents), totalSize); return totalSize;}

int main() { CURL* curl = curl_easy_init(); if (curl) { std::string response; curl_easy_setopt(curl, CURLOPT_URL, "https://api.example.com/data"); curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback); curl_easy_setopt(curl, CURLOPT_WRITEDATA, &response);

CURLcode res = curl_easy_perform(curl); if (res == CURLE_OK) { // نعمل مع response } curl_easy_cleanup(curl); } return 0;}


العيوب: واجهة برمجة تطبيقات على نمط C (تتطلب إدارة يدوية للذاكرة)، الحاجة إلى التجميع مع علامات الربط (-lcurl).



2. cpp-httplib — مكتبة خفيفة ورأس واحد (header-only)



cpp-httplib (للمؤلف yhirose) هي مكتبة حديثة، ذات رأس واحد (header-only) لـ C++11 وما فوق. لا تتطلب تبعيات خارجية (باستثناء OpenSSL لـ HTTPS) وهي مثالية للمشاريع الصغيرة والخدمات المصغرة والنماذج الأولية. تدعم الطلبات المتزامنة وغير المتزامنة، والكوكيز، والمهلات، وبيانات multipart/form-data.



مثال على طلب POST مع JSON:



#include <httplib.h>

int main() { httplib::Client cli("https://api.example.com"); httplib::Headers headers = { {"Content-Type", "application/json"} }; auto res = cli.Post("/submit", headers, R"({"key":"value"})", "application/json"); if (res && res->status == 200) { std::cout << res->body << std::endl; } return 0;}


الإيجابيات: أدنى حد للدخول، لا حاجة للربط، كود C++ نظيف. السلبيات: دعم محدود للوظائف المتقدمة (مثل HTTP/2).



3. Boost.Beast — أداة قوية للمحترفين



Boost.Beast هي مكتبة من فريق Boost، مبنية فوق Boost.Asio. توفر تحكمًا منخفض المستوى في اتصالات HTTP/1.x و WebSocket. يُوصى بها للأنظمة عالية التحميل حيث تكون الأداء والمعالجة غير المتزامنة مهمة.



مثال على عميل HTTP غير متزامن (جزء):



#include <boost/beast/core.hpp>#include <boost/beast/http.hpp>#include <boost/beast/version.hpp>#include <boost/asio/connect.hpp>#include <boost/asio/ip/tcp.hpp>

namespace beast = boost::beast;namespace http = beast::http;namespace net = boost::asio;using tcp = net::ip::tcp;

int main() { net::io_context ioc; tcp::resolver resolver(ioc); beast::tcp_stream stream(ioc);

auto const results = resolver.resolv

توصيات