عميل HTTP للغة C++: مراجعة أفضل المكتبات
عند تطوير التطبيقات الحديثة بلغة C++، غالبًا ما تنشأ الحاجة للتفاعل مع خوادم الويب باستخدام بروتوكول HTTP. سواء كان تحميل البيانات من API، أو إرسال النماذج، أو تبادل رسائل JSON - لا يمكن الاستغناء عن عميل HTTP موثوق. على عكس العديد من اللغات الحديثة، لا تتضمن المكتبة القياسية للغة C++ أدوات مدمجة للعمل مع HTTP. لحسن الحظ، توجد العديد من المكتبات الناضجة وعالية الأداء التي تحل هذه المشكلة. في هذه المقالة، سنستعرض أربعة من أفضل عملاء HTTP للغة C++، ونقارن ميزاتهم، ونقدم أمثلة عملية.
1. libcurl (cURL)
libcurl هي بلا شك المكتبة الأكثر شهرة والمختبرة عبر الزمن لنقل البيانات عبر بروتوكولات متعددة، بما في ذلك HTTP/1.1 و HTTP/2. هي مكتوبة بلغة C، ولكن لها أغلفة ممتازة للغة C++ (مثل curlpp). تُستخدم libcurl في آلاف المشاريع، من الأنظمة المدمجة إلى تطبيقات الخوادم.
الميزات الرئيسية:
- دعم HTTP، HTTPS، FTP، SMTP والعديد من البروتوكولات الأخرى.
- العمل مع SSL/TLS (OpenSSL، Schannel، NSS).
- الطلبات غير المتزامنة عبر واجهة
multi. - إعداد مرن للرؤوس، ملفات تعريف الارتباط، البروكسي، المهلات الزمنية.
- التوافق عبر المنصات (Windows، Linux، macOS، أنظمة تشغيل الجوال).
مثال بسيط لطلب GET باستخدام الغلاف C++ curlpp:
#include <curlpp/cURLpp.hpp>#include <curlpp/Easy.hpp>#include <sstream>
int main() { try { curlpp::Cleanup cleaner; curlpp::Easy request;
// إعداد URL request.setOpt(new curlpp::options::Url("https://api.example.com/data"));
// الحصول على الاستجابة في تيار نصي std::ostringstream response; request.setOpt(new curlpp::options::WriteStream(&response));
// تنفيذ الطلب request.perform();
std::cout << "الاستجابة: " << response.str() << std::endl; } catch (curlpp::RuntimeError & e) { std::cerr << "خطأ: " << e.what() << std::endl; } return 0;}2. C++ REST SDK (cpprestsdk)
C++ REST SDK (المعروف سابقًا باسم Casablanca) هي مكتبة غير متزامنة من Microsoft، موجهة للعمل مع خدمات RESTful. توفر واجهة سهلة الاستخدام تعتمد على pplx::task (مشابه لـ C++ std::future)، مما يبسط كتابة الكود غير المحظور.
الميزات الرئيسية:
- عدم التزامن الكامل بناءً على
taskوcontinuation. - دعم مدمج لـ JSON (cpprest/json.h).
- عميل WebSocket.
- العمل مع HTTP/HTTPS، المصادقة (Basic، OAuth).
- التوافق عبر المنصات (Windows، Linux، macOS).
مثال لطلب POST غير متزامن مع JSON:
#include <cpprest/http_client.h>#include <cpprest/filestream.h>#include <cpprest/json.h>
using namespace web;using namespace web::http;using namespace web::http::client;
int main() { http_client client(U("https://api.example.com"));
// تشكيل نص JSON للطلب json::value body; body[U("name")] = json::value::string(U("John")); body[U("age")] = json::value::number(30);
// طلب POST client.request(methods::POST, U("/users"), body.serialize(), U("application/json")) .then([](http_response response) { if (response.status_code() == status_codes::Created) { return response.extract_json(); } throw std::runtime_error("خطأ في الطلب"); }) .then([](json::value answer) { std::cout << "الاستجابة: " << answer.serialize() << std::endl;