Adrianistán

Usando Iron, un web framework para Rust

20/11/2016
Actualmente, si quiéres hacer una aplicación web con Rust, te recomiendo Rocket, es mucho más sencillo de usar, más potente, más rápido y tiene más usuarios.

Rust cada día atrae a más desarrolladores. Es eficiente y es robusto. Mozilla ha sido la principal impulsora de este lenguaje para ser usado en entornos tan complejos como el propio Firefox.

Hoy vamos a introducirnos en el mundo del desarrollo web con Rust. Cuando la gente oye desarrollo web normalmente se piensa en lenguajes como PHP, Python, Ruby o JavaScript. Estos son lenguajes con los que es rápido desarrollar algo, aunque son mucho menos eficientes y es más fácil cometer errores debido a que son interpretados directamente. Un paso por encima tenemos a Java y C#, que cubren en parte las carencias de los otros lenguajes mencionados. Ha llegado la hora de hablar de Rust. Si bien es cierto que hay web frameworks en C++, nunca han sido muy populares. ¿Será Rust la opción que finalmente nos permita tener aplicaciones web con una eficiencia nativa?

Existen varios web frameworks en Rust, para este tutorial vamos a usar Iron, el más popular según Crates.io. Quizá te interese echar un vistazo también a Rocket, mi preferido.

ironframework

Crear proyecto e instalar Iron


Lo primero que hay que hacer es crear un nuevo proyecto en Rust, lo hacemos gracias a Cargo.
cargo new --bin MundoRust

cd MundoRust

Ahora editamos el fichero Cargo.toml para añadir las dependencias que vamos a usar.
[package]
name = "MundoRust"
version = "0.1.0"
authors = ["Adrián Arroyo Calle"]

[dependencies]
iron = "0.4.0"
router = "0.4.0"
staticfile = "0.3.1"
mount = "0.2.1"


Ahora obtenemos las dependencias especificadas con Cargo.
cargo run

Hola Mundo con Iron


Vamos a empezar a programar en Rust. Vamos a hacer una simple aplicación que devuelva "Hola Rustáceos" por HTTP.

Editamos el archivo src/main.rs
extern crate iron;

use iron::prelude::*;

fn hola(_: &mut Request) -> IronResult<Response> {
Ok(Response::with((iron::status::Ok, "Hola Rustaceos")))
}

fn main() {
Iron::new(hola).http("0.0.0.0:80").unwrap();
}

holarustaceos

Usando router para el enrutamiento


Hemos hecho un pequeño servidor HTTP con Iron. Pero nos falta algo, que sea capaz de manejar rutas. Que miweb.com/hola no sea lo mismo que miweb.com/adios. Iron por defecto no trae enrutador, pero es muy habitual usar Router, que ya hemos instalado antes por conveniencia.
extern crate iron;
extern crate router;

use iron::prelude::*;
use router::Router;

fn get_page(r: &mut Request) -> IronResult<Response>{
let path = r.url.path();
Ok(Response::with((iron::status::Ok, format!("Hola, peticion GET {}",path[0]))))
}

fn submit(_: &mut Request) -> IronResult<Response>{
Ok(Response::with((iron::status::Ok, "Peticion POST")))
}

fn main() {
let mut router = Router::new();

router.get("/:page", get_page, "page");
router.post("/submit", submit, "subdmit");

Iron::new(router).http("0.0.0.0:80").unwrap();

}

getiron

Archivos estáticos


Para gestionar los ficheros estáticos vamos a usar staticfile y mount, otras dos librerías para Iron.
extern crate iron;
extern crate router;
extern crate staticfile;
extern crate mount;

use iron::prelude::*;
use router::Router;
use staticfile::Static;
use mount::Mount;

fn get_page(r: &mut Request) -> IronResult<Response>{
let path = r.url.path();
Ok(Response::with((iron::status::Ok, format!("Hola, peticion GET {}",path[0]))))
}

fn main() {
let mut router = Router::new();

router.get("/:page", get_page, "page");

let mut mount = Mount::new();
mount.mount("/public",Static::new("static/"));
mount.mount("/",router);

Iron::new(mount).http("0.0.0.0:80").unwrap();
}

ironstaticfile

 

Hemos dado nuestros primeros pasos en Iron, un web framework para Rust. Iron es completamente modular y soporta muchas más cosas que aquí no hemos visto. Gran parte de su funcionalidad se implementa a través de middleware, como en otros web frameworks populares.
Tags: programacion server http express rust crate web-framework web