Столовая - первый проект, который я реализую в Rust. Это клон колбы, мой самый любимый веб -фреймворк Python. Существует код для примера реализации в хранилище столовой-импл.
Это ни в коем случае не завершено, но я работаю над этим, и теперь он доступен на Crates.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/ каталоге как файлПосле того, как обработчики прикреплены к маршрутам, следующий шаг - просто запустить сервер. Каждый раз, когда получен запрос, он отправляется с соответствующим обработчиком на работника тренеров. Рабочий уведомляет родительский процесс, когда он закончен, а затем ответ передается обратно клиенту. Довольно простые вещи!
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 ( ) ;
}