العمل مع واجهات برمجة التطبيقات بلغة C++: REST وGraphQL وgRPC
عندما يتعلق الأمر بإنشاء أو استهلاك واجهات برمجة التطبيقات، يلجأ العديد من المطورين بدافع العادة إلى Python أو Node.js أو Go. ولكن ماذا لو كنت بحاجة إلى أقصى أداء، أو تحكم منخفض المستوى في الذاكرة، أو كنت تعمل في نظام قديم حيث C++ هو الملك؟ الإجابة بسيطة: C++ ليس فقط حيًا - بل يزدهر في عالم واجهات برمجة التطبيقات. دعنا نستعرض ثلاثة مناهج رئيسية يجب أن يعرفها كل مطور C++: REST الكلاسيكي، وGraphQL الحديث، وgRPC عالي الأداء.
هذه المقالة ليست مرجعًا جافًا، بل دليلًا عمليًا مكتوبًا لأولئك الذين يريدون كتابة كود حقيقي. سننظر في كيفية تطبيق هذه التقنيات بلغة C++، ونقدم أمثلة مع المكتبات الشائعة، ونساعدك في اختيار الأداة المناسبة لمهمتك.
1. REST API بلغة C++: الكلاسيكي في ثوب حديث
لا يزال REST (نقل الحالة التمثيلية) أكثر أنماط واجهات برمجة التطبيقات شيوعًا. يُحب لبساطته، وقابلية قراءة JSON من قبل البشر، وعموميته. في C++، لدينا عدة أدوات قوية للعمل مع REST، ومن أشهرها cpprestsdk (المعروف أيضًا باسم Casablanca) من Microsoft.
كتابة عميل REST بلغة C++
تخيل أننا بحاجة للحصول على بيانات الطقس من واجهة برمجة تطبيقات عامة. إليك كيف يبدو ذلك باستخدام cpprestsdk:
#include <cpprest/http_client.h>#include <cpprest/filestream.h>#include <iostream>
using namespace web;using namespace web::http;using namespace web::http::client;
int main() { // إنشاء عميل HTTP http_client client(U("https://api.openweathermap.org/data/2.5"));
// تكوين طلب GET مع المعاملات uri_builder builder(U("/weather")); builder.append_query(U("q"), U("Moscow")); builder.append_query(U("appid"), U("YOUR_API_KEY")); builder.append_query(U("units"), U("metric"));
// إرسال الطلب والحصول على الرد client.request(methods::GET, builder.to_string()) .then([](http_response response) { if (response.status_code() == status_codes::OK) { return response.extract_json(); } throw std::runtime_error("Failed to fetch data"); }) .then([](json::value jsonData) { std::cout << "Temperature: " << jsonData[U("main")][U("temp")].as_double() << "°C" << std::endl; }) .wait();
return 0;}النقاط الرئيسية:
- اللاتزامنية: تستخدم cpprestsdk مكتبة الأنماط المتوازية (PPL) والمستقبليات (futures)، وهو مثالي لـ C++.
- العمل مع JSON: المحلل المدمج json::value يسمح بمعالجة البيانات بسهولة.
- التعدد المنصات: تعمل المكتبة على Windows وLinux وmacOS.
متى تختار REST؟
REST بلغة C++ مثالي لـ:
- عمليات CRUD البسيطة
- التكامل مع خدمات الويب (الشبكات الاجتماعية، أنظمة الدفع)
- النماذج الأولية والخدمات المصغرة ذات الحمل المنخفض
2. GraphQL: مرونة الاستعلامات بلغة C++
يحل GraphQL المشكلة الرئيسية لـ REST - الإفراط في الجلب (الحصول على بيانات زائدة) ونقص الجلب (الحاجة إلى استعلامات متعددة للحصول على معلومات كاملة). في C++، للعمل مع GraphQL غالبًا ما تُستخدم مكتبة cppgraphql أو كتابة عميل خاص يعتمد على libcurl.
مثال على استعلام GraphQL بلغة C++
لنفترض أننا بحاجة للحصول على ملف تعريف مستخدم وأحدث منشوراته - في REST سيتطلب ذلك استعلامين، بينما في GraphQL استعلام واحد:
#include <iostream>#include <curl/curl.h>#include <nlohmann/json.hpp>
using json = nlohmann::json;
static size_t WriteCallback(void *contents, size_t size, size_t nmemb, void *userp) { ((std::string*)userp)->a