Libzeep هو إطار تطبيق ويب مكتوب في C ++. لمشاهدة مشروع بداية ، تفضل بزيارة صفحة Libzeep-Webapp-Starter.
تم تطوير Libzeep في الأصل لجعل من السهل إنشاء خوادم الصابون. وبما أن العمل مع SOAP يعني العمل مع XML ولا توجد مكتبة C ++ XML لائقة على الرادار الخاص بي ، قمت بإنشاء مكتبة XML كاملة أيضًا.
لسوء الحظ (حسنًا ، بالنظر إلى العمل الذي قمت به) ، أثبت REST أنه أكثر شعبية من الصابون ، ولذا أضفت تطبيق JSON أفضل إلى الإصدار 4 من Libzeep وكذلك وسيلة لإنشاء خوادم REST بسهولة أكبر.
ولكن بعد ذلك ، اضطررت إلى استخدام Spring لبعض الوقت وتشعرت بالإعجاب ببساطة بناء تطبيقات الويب التفاعلية واعتقدت أنه ينبغي عليّ أن أحضر هذه البساطة إلى عالم C ++. بعد كل شيء ، تحتاج تطبيقاتي إلى سرعة خام ولا ، جافا ليست سريعة.
التجسد الحالي لـ Libzeep ، الإصدار 6.0 ، عبارة عن مجموعة من المكتبات التي تم إعادة تشكيلها بالكامل. واحد لمعالجة XML ، واحد للتعامل مع JSON وواحد لبناء تطبيقات الويب.
يتكون جزء XML من libzeep من محلل التحقق من صحة ، وتطبيق عقدة DOM (مثل) ، ومحرك بحث XPATH وكاتب/فسيح XML. يعمل التحقق من الصحة بناءً على تعريفات doctype.
يرجى ملاحظة أن Libzeep يهدف إلى توفير معالج XML المتوافق تمامًا كما هو محدد من قبل مؤسسة W3 (انظر: www.w3.org/tr/xml). هذا يعني أنه صارم كما يتطلب المعيار ويتوقف عن معالجة ملف عند التحقق من صحة التكوين الجيد ، أو عندما يبدو أن المستند غير صالح عندما يكون في وضع التحقق من التحقق. تتم الإبلاغ عن الخطأ في هذه الحالة.
مكتبة JSON في حد ذاتها بسيطة إلى حد ما. هناك بدائل أفضل بكثير إذا كنت تبحث عن JSON فقط. ولكن هذا التنفيذ مطلوب من قبل جزء تطبيق الويب.
ثم لدينا مكتبة تطبيق ويب. هذا واحد يجعل من السهل جدًا إنشاء خادم HTTP يخدم HTML ولكنه يتحدث أيضًا عن الراحة والصابون. يتكون التنفيذ الحالي من فئة خادم HTTP يمكنك إضافة وحدات التحكم إليها. كل وحدة تحكم لديها بادئة المسار وتعامل طلبات لبعض الإدخالات في مسار URI هذا. وحدة تحكم الطبقة الأساسية بسيطة وفي الواقع هي مجرد فئة أساسية.
يمكن استخدام وحدة تحكم HTML كفئة أساسية حتى تتمكن من إضافة طرق سيتم استدعاؤها لبعض مسارات URI. بالاشتراك مع معالجات العلامات المتاحة ، يمكنك بعد ذلك إنشاء وإرجاع صفحات XHTML الديناميكية.
يمكن استخدام وحدات التحكم في الباقي والصابون كطبقات أساسية لتصدير أساليب التصدير التي تأخذ معلمات بسيطة أو معقدة مسماة وإرجاع هياكل البيانات المغطاة JSON والصابون على التوالي.
يمكن العثور على الوثائق الكاملة على:
www.hekkelman.com/libzeep-doc/
لبناء libzeep ، يجب أن يكون لديك CMake تثبيت.
تحتاج أيضًا إلى تثبيت مكتبة تاريخ Howard Hinnants.
وما لم تكن تستخدم MacOS ، فمن المستحسن تثبيت MRC من أجل الحصول على موارد دعم في Libzeep.
أوامر بناء libzeep من سطر الأوامر هي على سبيل المثال:
git clone https://github.com/mhekkel/libzeep
cd libzeep
cmake -S . -B build -DCMAKE_BUILD_TYPE=Release
cmake --build build
ctest --test-dir build
cmake --install build قم بإنشاء قالب في XHTML أولاً ، قم بتخزين هذا كـ hello.xhtml في دليل يسمى docroot :
<! DOCTYPE html SYSTEM "about:legacy-compat">
< html xmlns = " http://www.w3.org/1999/xhtml "
xmlns : z = " http://www.hekkelman.com/libzeep/m2 " >
< head >
< title >Hello</ title >
</ head >
< p >Hello, < span z : text = " ${name ?: 'world'} " />!</ p >
</ html > ثم قم بإنشاء ملف مصدر يسمى http-server.cpp مع المحتوى التالي:
# define WEBAPP_USES_RESOURCES 0
# include < zeep/http/server.hpp >
# include < zeep/http/html-controller.hpp >
# include < zeep/http/template-processor.hpp >
class hello_controller : public zeep ::http::html_controller
{
public:
hello_controller ()
{
map_get ( " " , &hello_controller::handle_index, " name " );
map_get ( " index.html " , &hello_controller::handle_index, " name " );
map_get ( " hello/{name} " , &hello_controller::handle_index, " name " );
}
zeep::http::reply handle_index ( const zeep::http::scope& scope,
std::optional<std::string> user)
{
zeep::http::scope sub (scope);
sub. put ( " name " , user. value_or ( " world " ));
return get_template_processor (). create_reply_from_template ( " hello.xhtml " , sub);
}
};
int main ()
{
zeep::http::server srv ( std::filesystem::canonical ( " docroot " ));
srv. add_controller ( new hello_controller ());
srv. bind ( " :: " , 8080 );
srv. run ( 2 );
return 0 ;
} إنشاء ملف CMakeLists.txt :
cmake_minimum_required ( VERSION 3.16)
project (http-server LANGUAGES CXX)
set (CXX_EXTENSIONS OFF )
set (CMAKE_CXX_STANDARD 17)
set (CMAKE_CXX_STANDARD_REQUIRED ON )
find_package (zeep REQUIRED)
add_executable (http-server http-server.cpp)
target_link_libraries (http-server zeep::zeep)وتكوين وإنشاء التطبيق:
cmake .
cmake --build .ثم قم بتشغيله:
./http-serverيمكنك الآن الوصول إلى النتيجة باستخدام عنوان URL التالي: