المقصف هو أول مشروع أقوم بتنفيذه في الصدأ. إنه استنساخ من القارورة ، إطار عمل بيثون المفضل لدي. هناك رمز لتنفيذ مثال في مستودع المقصف-IMPL.
إنها ليست كاملة بأي حال من الأحوال ، لكنني أعمل عليها ، وهي متوفرة الآن على Catse.io! للتثبيت والتحقق من ذلك ، أضف ما يلي إلى Cargo.toml:
[ dependencies ]
canteen = " 0.5 " المبدأ وراء المقصف بسيط - يتم تعريف وظائف المعالج على أنها وظائف الصدأ البسيطة التي تأخذ Request وإرجاع Response . ثم يتم إرفاق المعالجات بطريق واحد أو أكثر وطرق/أفعال HTTP. يتم تحديد الطرق باستخدام بناء جملة بسيط يتيح لك تحديد المتغيرات داخلها ؛ المتغيرات التي يمكن بعد ذلك استخراجها لأداء عمليات مختلفة. حاليا ، يمكن استخدام الأنواع المتغيرة التالية:
<str:name> سوف يتطابق مع أي شيء داخل مقطع مسار ، وإرجاع String<int:name> سيعود عدد صحيح موقّع ( i32 ) من مقطع مسارcnt.add_route("/api/foo/<int:foo_id>", &[Method::Get], my_handler) سوف يتطابق مع "/api/foo/123" ولكن ليس "/api/foo/123.34" أو "/api/foo/bar"<uint:name> سيعود عدد صحيح غير موقّع ( u32 )<float:name> يفعل نفس الشيء مثل تعريف المعلمة int ، ولكنه يطابق الأرقام مع نقاط عشرية ويعيد f32<path:name> سوف تأخذ بجشع جميع بيانات المسار الموجودة ، وإرجاع Stringcnt.add_route("/static/<path:name>", &[Method::Get], utils::static_file) سوف يخدم أي شيء في /static/ directory كملفبعد إرفاق المعالجات بالطرق ، فإن الخطوة التالية هي ببساطة بدء تشغيل الخادم. في أي وقت يتم استلام طلب ، يتم إرساله مع المعالج المرتبط بعامل Threadpool. يقوم العامل بإخطار عملية الوالدين عند الانتهاء ، ثم يتم إرسال الاستجابة إلى العميل. أشياء واضحة جدا!
extern crate canteen ;
use canteen :: * ;
use canteen :: utils ;
fn hello_handler ( req : & Request ) -> Response {
let mut res = Response :: new ( ) ;
res . set_status ( 200 ) ;
res . set_content_type ( "text/plain" ) ;
res . append ( "Hello, world!" ) ;
res
}
fn double_handler ( req : & Request ) -> Response {
let to_dbl : i32 = req . get ( "to_dbl" ) ;
/* simpler response generation syntax */
utils :: make_response ( format ! ( "{}" , to_dbl * 2 ) , "text/plain" , 200 )
}
fn main ( ) {
let cnt = Canteen :: new ( ) ;
// bind to the listening address
cnt . bind ( ( "127.0.0.1" , 8080 ) ) ;
// set the default route handler to show a 404 message
cnt . set_default ( utils :: err_404 ) ;
// respond to requests to / with "Hello, world!"
cnt . add_route ( "/" , & [ Method :: Get ] , hello_handler ) ;
// pull a variable from the path and do something with it
cnt . add_route ( "/double/<int:to_dbl>" , & [ Method :: Get ] , double_handler ) ;
// serve raw files from the /static/ directory
cnt . add_route ( "/static/<path:path>" , & [ Method :: Get ] , utils :: static_file ) ;
cnt . run ( ) ;
}