عميل HTTP للغة C++: مراجعة أفضل المكتبات
عند تطوير التطبيقات الحديثة بلغة C++، نادرًا ما يمكن الاستغناء عن التفاعل مع الخوادم البعيدة. سواء كان تحميل البيانات، إرسال النماذج، العمل مع REST API، أو مجرد تحليل صفحات الويب - فأنت بحاجة إلى عميل HTTP موثوق للغة C++. في هذه المقالة، سنستعرض أربع مكتبات رائعة ستساعدك على العمل بسهولة وكفاءة مع بروتوكول HTTP.
1. cpp-httplib — البساطة والخفة
cpp-httplib (أو ببساطة httplib) هي مكتبة من نوع header-only لا تتطلب تثبيتًا. إنها مثالية للمشاريع الصغيرة حيث لا ترغب في التعامل مع التبعيات.
- الإيجابيات: واجهة برمجة تطبيقات بسيطة، تعمل "فورًا"، تدعم HTTPS (عبر OpenSSL).
- السلبيات: وظائف محدودة (لا توجد طلبات متعددة الخيوط، ولا WebSocket).
#include <httplib.h>#include <iostream>
int main() { httplib::Client cli("http://jsonplaceholder.typicode.com"); auto res = cli.Get("/posts/1"); if (res && res->status == 200) { std::cout << "الرد: " << res->body << std::endl; } return 0;}2. libcurl — المخضرم المثبت
libcurl هو المعيار الفعلي للعمل مع HTTP في C/C++. يُستخدم في آلاف المشاريع، بما في ذلك خوادم الويب والأدوات سطر الأوامر. يتطلب تثبيت المكتبة والربط.
- الإيجابيات: عدد هائل من البروتوكولات (HTTP/2، FTP، SMTP، WebSocket)، عبر المنصات، أداء عالٍ.
- السلبيات: واجهة برمجة تطبيقات بأسلوب C (غير مريحة لـ C++)، إعداد معقد لتعدد الخيوط.
#include <curl/curl.h>#include <string>
size_t WriteCallback(void* contents, size_t size, size_t nmemb, std::string* output) { size_t total = size * nmemb; output->append((char*)contents, total); return total;}
int main() { CURL* curl = curl_easy_init(); if (curl) { std::string response; curl_easy_setopt(curl, CURLOPT_URL, "http://example.com"); curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback); curl_easy_setopt(curl, CURLOPT_WRITEDATA, &response); curl_easy_perform(curl); curl_easy_cleanup(curl); } return 0;}3. Boost.Beast — قوة Boost وعدم التزامن
Boost.Beast هو جزء من نظام Boost البيئي، ويوفر إمكانيات HTTP و WebSocket منخفضة المستوى. المكتبة مبنية على Boost.Asio، مما يمنحك تحكمًا كاملاً في العمليات غير المتزامنة.
- الإيجابيات: عدم تزامن كامل، دعم HTTP/1.1، WebSocket، توافق مع C++17/20.
- السلبيات: يتطلب فهمًا عميقًا لـ
Asio، حجم كبير من الكود للطلبات البسيطة.
#include <boost/beast/core.hpp>#include <boost/beast/http.hpp>#include <boost/asio.hpp>#include <iostream>
namespace beast = boost::beast;namespace http = beast::http;namespace net = boost::asio;
int main() { net::io_context ioc; beast::tcp_stream stream(ioc); stream.connect("httpbin.org", 80);
http::request<http::string_body> req{http::verb::get, "/get", 11}; req.set(http::field::host, "httpbin.org"); http::write(stream, req);
beast::flat_buffer buffer; http::response<http::dynamic_body> res; http::read(stream, buffer, res); std::cout << beast::buffers_to_string(res.body().data()) << std::endl; return 0;}4. Poco — المعيار المؤسسي
Poco (POrtable COmponents) هو إطار عمل متكامل للغة C++، يشمل عميل HTTP، خادم، مآخذ شبكة، العمل مع XML/JSON