この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
Introduction
nickel.rsはRust用Webフレームワークです。
このフレームワークはnodeで人気のexpressにインスパイアされており、
軽量でシンプルに扱うことができます。
Environment
- MacBook Pro (13-inch, M1, 2020)
- OS : MacOS 11.3.1
- rust : 1.60.0
Try nickel.rs
ではnickelを試してみましょう。まずはcargoでアプリの作成。
% cargo new nickel-demo --bin && cd nickel-demo
Created binary (application) `nickel-demo` package
Cargo.tomlのdependenciesにライブラリを追加。
[dependencies]
nickel = "0.11.0"
main.rsを以下のように修正。
Nickel::newでサーバオブジェクトを作成してハンドラを登録しています。
utilize関数は、リクエスト前に他のミドルウェアハンドラの中から
起動されるハンドラを登録します。
expressと同じように、middlewareは積み重ねることができ、登録した順番に呼び出されます。
#[macro_use] extern crate nickel;
use nickel::{Nickel,HttpRouter};
fn main() {
let mut server = Nickel::new();
server.utilize(router! {
get "**" => |_req, _res| {
"Hello world!"
}
});
server.listen("127.0.0.1:6767").unwrap();
}
cargo runで起動し、
http://127.0.0.1:6767にアクセスするとHello Worldが表示されます。
% cargo run
% curl http://127.0.0.1:6767
Hello world!
Routing
↓のようにrouting登録ができます。
fn main() {
let mut server = Nickel::new();
server.get("/foo", middleware!("This is the /foo handler"));
server.get("/bar", middleware!("This is the /bar handler"));
server.listen("127.0.0.1:6767").unwrap();
}
router!マクロでrouting登録も可能です。
fn main() {
let mut server = Nickel::new();
server.utilize(router! {
get "/foo" => |_req, _res| {
"This is the /foo handler"
}
get "/bar" => |_req, _res| {
"This is the /bar handler"
}
});
server.listen("127.0.0.1:6767").unwrap();
}
Middleware
expressといえばmiddleware。
nickelでもmiddlewareをスタックして処理を実行できます。
↓ではmiddleware!マクロですべてのリクエストに対して
ログ出力処理を追加しています。
fn main() {
let mut server = Nickel::new();
server.utilize(middleware! { |req|
println!("logging request: {:?}", req.origin.uri);
});
server.utilize(router! {
get "/foo" => |_req, _res| {
"This is the /foo handler"
}
get "/bar" => |_req, _res| {
"This is the /bar handler"
}
});
server.listen("127.0.0.1:6767").unwrap();
}
Template
nickelは標準でmustache.rsテンプレートが使用可能です。
nickel-demo/assetsディレクトリを作成してtemplate.tplを下記のように作成。
<html>
<body>
<h1>
Counter : {{ counter }}!
</h1>
</body>
</html>
main.rsでカウンターを作成し、テンプレートに渡します。
#[macro_use] extern crate nickel;
use nickel::{Nickel,HttpRouter};
use std::sync::atomic::{AtomicUsize, Ordering};
use std::collections::HashMap;
fn main() {
let mut server = Nickel::new();
let visits = AtomicUsize::new(0);
server.utilize(middleware! { |req|
println!("logging request: {:?}", req.origin.uri);
});
server.get("/buzz", middleware! { |_, response|
let mut data = HashMap::new();
let count = visits.fetch_add(1, Ordering::Relaxed);
data.insert("counter", count);
return response.render("assets/template.tpl", &data);
});
server.listen("127.0.0.1:6767").unwrap();
}
http://127.0.0.1:6767/buzzにアクセスすると、
template.tpl内容が表示されます。
Summary
RustのWebフレームワーク、nickelを試してみました。
expressに慣れた人なら理解しやすそうです。