Hello World
hello_worldバイナリプロジェクトを作ろう
$ cargo new hello_world --bin
サーバーはmain関数をもったプログラムに成るので、--binオプションを忘れに付けましょう。
Cargo.tomlにIronを追加する
[dependencies.iron] version = "*"
まずCargo.tomlにironのdependenciesを追加しましょう。
これで、このアプリケーションでiron createを利用できるようになりました。
main関数を書く
次に、以下のように書くことでIronのサーバーをlocalhost:3000で立ち上げることができます。
extern crate iron;
use iron::prelude::*;
use iron::status;
fn main() {
fn hello_world(_: &mut Request) -> IronResult<Response> {
Ok(Response::with((status::Ok, "Hello, world")))
}
let _server = Iron::new(hello_world).http("localhost:3000").unwrap();
println!("Lisning on port 3000");
}
こまかく見ていきましょう。
extern crate iron; use iron::prelude::*; use iron::status;
については通常のcrateのようにironをロードしているようです。
Handler
fn hello_world(_: &mut Request) -> IronResult<Response> {
Ok(Response::with((status::Ok, "Hello, world")))
}
この関数は、なにやらRequestのミュータブルな参照をうけとって、
IronResultにくるんだResponseを返しているようです。
この部分は、Ironのドキュメントに依るとHandlerと呼ばれるようです。
この関数がリクエスト時に呼び出され、Requestに対応するResponseを返すことで、
ユーザーにデータが返されるようです。
pub trait Handler: Send + Sync + 'static {
fn handle(&self, &mut Request) -> IronResult<Response>;
}
という定義で、
impl<F> Handler for F where F: Send + Sync + 'static + Fn(&mut Request) -> IronResult<Response>
が定義されているようなので、関数をHandlerとして利用できるようです。
参考
Trait iron::middleware::Handler
Response
サーバーからのリクエストに対する結果を返すときに利用するResponseですが
pub struct Response {
pub status: Option<Status>,
pub headers: Headers,
pub extensions: TypeMap,
pub body: Option<Box<WriteBody>>,
}
のような定義になっています。
Responseの作成のところでResponse::with((...))のようにして、statusやbodyを設定しているようです。
これらは、Modifierという仕組みになっており、タプルのそれぞれの要素をつかってどのようにデータを変更するかを
別途定義しているようです。
Server
let _server = Iron::new(hello_world).http("localhost:3000").unwrap();
HTTPサーバーを起動するには、このようにIron::newにHandlerを渡してやれば良いようです。
今回は、先ほど定義したhello_world関数をHandlerとして利用しています。
httpメソッドに渡した"localhost:3000"という文字列がパースされて、localhostの3000番ポートでHTTPサーバーが起動するようです。
起動
このようにして書いたプロジェクトをcargo runしてやれば無事http://localhost:3000でサーバーが起動します。
まとめ
今回はIronをつかって非常に単純なHTTPサーバーを起動する手順を確認しました。