Posted at

Rustでhyper使ってHTMLを扱ってみた

More than 3 years have passed since last update.


RustでWebアプリケーション?

Go言語によるWebアプリケーション開発を読んでいて、これはRustで書くとどうなるんだろうかと思って、「1.1 シンプルなWebサーバー」のみ書いてみました。ほんとシンプルなやつです。

私は完全にRust初心者なのでたぶんあまり正しくなかったり非効率だったりしている気がします。

extern crate hyper;

use std::io::Write;
use hyper::Server;
use hyper::server::Request;
use hyper::server::Response;
use hyper::header::ContentType;
use hyper::mime::{Mime, TopLevel, SubLevel};
use hyper::header::ContentLength;

fn hello(_: Request, mut res: Response) {
let body = b"
<html>
<head><title>chat</title></head>
<body>
chat!
</body>
</html>
"
;
res.headers_mut().set(ContentLength(body.len() as u64));
res.headers_mut().set(ContentType(Mime(TopLevel::Text, SubLevel::Html, vec![])));

let mut res = res.start().unwrap();
res.write_all(body).unwrap();
}

fn main() {
Server::http("127.0.0.1:3000")
.unwrap()
.handle(hello)
.unwrap();
}

Webサーバはhyperを使いました。

ironとか使おうと思ったんですが、本と同じ感じでやりたかったんでまずはこれでやってみました。


困ったこと


ContentTypeの指定

ContentTypeを指定する必要があったんだけど、ちょっと指定の仕方が(自分としては)複雑で、ContentType(Mime(TopLevel::Text, SubLevel::Html, vec![]))という記法にたどり着くのに少し時間がかかった。


日本語表示

日本語の表示はまだうまくできてないです。どうやったらいいんだろう。


HTMLを取り扱うサンプルを見つけられなかった

RustのWebアプリケーションのサンプルはほとんどWebAPIで、HTMLを表示するようなサンプルが全然見つからなくて、やり方に苦労しました。

最近の流れとしてフロントとサーバサイドの役割は分かれてるし、JSONとか扱えれば充分とは思いつつも、全く見つからないとは思ってなかった。うまく探したらあるんだろうけど。。