Kantin adalah proyek pertama yang saya implementasikan di Rust. Ini adalah klon flask, kerangka kerja web python favorit saya. Ada kode untuk contoh implementasi dalam repositori Canteen-Impl.
Ini sama sekali tidak lengkap, tapi saya sedang mengerjakannya, dan sekarang tersedia di Crates.io! Untuk menginstal dan memeriksanya, tambahkan yang berikut ini ke Cargo.toml Anda:
[ dependencies ]
canteen = " 0.5 " Prinsip di balik kantin sederhana - fungsi penangan didefinisikan sebagai fungsi karat sederhana yang menerima Request dan mengembalikan Response . Penangan kemudian dilampirkan ke satu atau lebih rute dan metode/kata kerja HTTP. Rute ditentukan menggunakan sintaks sederhana yang memungkinkan Anda mendefinisikan variabel di dalamnya; Variabel yang kemudian dapat diekstraksi untuk melakukan berbagai operasi. Saat ini, jenis variabel berikut dapat digunakan:
<str:name> akan cocok dengan apa pun di dalam segmen jalur, mengembalikan String<int:name> akan mengembalikan integer yang ditandatangani ( i32 ) dari segmen jalurcnt.add_route("/api/foo/<int:foo_id>", &[Method::Get], my_handler) akan cocok "/api/foo/123" tetapi tidak "/api/foo/123.34" atau "/api/foo/bar"<uint:name> akan mengembalikan bilangan bulat yang tidak ditandatangani ( u32 )<float:name> melakukan hal yang sama dengan definisi parameter int , tetapi cocok dengan angka dengan titik desimal dan mengembalikan f32<path:name> akan dengan rakus mengambil semua data jalur yang terkandung, mengembalikan Stringcnt.add_route("/static/<path:name>", &[Method::Get], utils::static_file) akan melayani apa pun di /static/ direktori sebagai fileSetelah penangan melekat pada rute, langkah selanjutnya adalah dengan hanya memulai server. Setiap kali permintaan diterima, dikirim dengan pawang terkait ke pekerja threadpool. Pekerja memberi tahu proses induk setelah selesai, dan kemudian respons ditransmisikan kembali ke klien. Barang yang cukup mudah!
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 ( ) ;
}