Let's write β

プログラミング中にできたことか、思ったこととか

RustでWebプログラミング No.1 ~ IronのインストールとHello World~

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((...))のようにして、statusbodyを設定しているようです。 これらは、Modifierという仕組みになっており、タプルのそれぞれの要素をつかってどのようにデータを変更するかを 別途定義しているようです。

Server

let _server = Iron::new(hello_world).http("localhost:3000").unwrap();

HTTPサーバーを起動するには、このようにIron::newHandlerを渡してやれば良いようです。 今回は、先ほど定義したhello_world関数をHandlerとして利用しています。

httpメソッドに渡した"localhost:3000"という文字列がパースされて、localhostの3000番ポートでHTTPサーバーが起動するようです。

起動

このようにして書いたプロジェクトをcargo runしてやれば無事http://localhost:3000でサーバーが起動します。

まとめ

今回はIronをつかって非常に単純なHTTPサーバーを起動する手順を確認しました。