Adrianistán

El blog de Adrián Arroyo


Usando Iron, un web framework para Rust

- Adrián Arroyo Calle

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.

Comentarios

Alfonso
Muchas gracias por el aporte
Jesús Perales
Es muy parecido a express de nodejs, pero en definitiva sigo pensando que javascript es el futuro, quiza le meta algo a rust.
aarroyoc
Hola Jesús, Sí, parece que todos los web frameworks que se diseñan ahora quieren seguir el patrón de Express (que si no me equivoco, era originalmente de Sinatra en Ruby). Yo también creo que Node tendrá más uso en el futuro, llevó usándolo desde Node 0.8 y es fantástico para ciertas cosas. Tengo interés en ver como termina la cosa después de que ES6 y ES7 se implanten finalmente (clases, generadores, async/await) y qué librerías acaban por imponerse para determinadas cosas (y de que manera). Por otro lado, a día de hoy se puede usar código Rust en Node.js gracias a <a href="http://neon.rustbridge.io/" rel="nofollow">Neon</a> Saludos!
[&#8230;] he hablado de Rust varias veces en este blog. La última vez fue en el tutorial de Iron, que os recomiendo ver si os interesa el tema del desarrollo web [&#8230;]
[&#8230;] aprendiendo en el blog sobre interesantes proyectos hechos para Rust. Ya hemos visto Iron, Piston y Neon. Hoy veremos Maud, un potente motor de plantillas que se centra en la eficiencia. [&#8230;]
[&#8230;] ya hemos hablado de Iron como un web framework para Rust. Sin embargo desde que escribí ese post ha surgido otra librería que ha ganado mucha [&#8230;]

Añadir comentario

Todos los comentarios están sujetos a moderación