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サーバーを起動する手順を確認しました。