Graffiti Rules: Hello Word con Spray

Hoy toca empezar con una herramienta para realizar API REST: Spray. Para construir dichas API’s, Spray define un DSL (Lenguaje Específico de Dominio) con el que definir cuales son las rutas y las reacciones a las llamadas HTTP que recibamos. Existen otras alternativas para realizar este tipo de API’s: scalatra, Play, Lift … Sin embargo, este viene perfecto para luego hablar de su evolución: Akka-HTTP. Pero no vayamos tan rápido, vamos poco a poco.

computers20graffiti20error20technology20explorer201440x90020wallpaper_www-wallpaperfo-com_98

El objetivo de este POST es hacer una incursión de iniciación. Nos podemos ir contentos si conseguimos realizar un Hello World con Spray. Para ello, lo principal es conocer cuales son los módulos en los que se compone el framework. Aquí van algunos de los principales:

  • spray-can: servidor HTTP que nos permitirá levantar nuestra API.
  • spray-routing: DSL de definición de rutas para definir el comportamiento deseado. A diferencia de otros frameworks (como Play), las rutas están definidas en código en vez de en un fichero de texto o de configuración.
  • spray-http: módulo que se encarga de modelar y manejar el protocolo HTTP.
  • spray-json: módulo para serialización y deserialización de mensajes en formato JSON. Es reemplazable por otros módulos de serialización a JSON como play-json, jackson…
  • spray-testkit: pequeño DSL para realizar testing de los endpoints de una manera muy sencilla.

En este primer ejemplo, por su sencillez, no necesitaremos todos ellos. Ya iremos utilizando otros módulos más adelante. Por ello, lo primero que tenemos que hacer es construir nuestro fichero SBT con las dependencias necesarias. En nuestro caso nos basta con spray-can, spray-routing y akka. Por tanto, añadimos dichas dependencias al fichero build.sbt:

val akkaV = "2.3.9"
val sprayV = "1.3.3"

libraryDependencies ++= Seq(
    "io.spray" %% "spray-can" % sprayV,
    "io.spray" %% "spray-routing" % sprayV,
    "com.typesafe.akka" %% "akka-actor" % akkaV
  )

Una vez que tenemos la configuración lista, toca ponernos a escribir el código Scala. Es importante saber que Spray está construido sobre Akka. Como vamos a ver, mucha de la funcionalidad se basa en utilizar actores.

En primer lugar vamos a definir nuestra ruta. En dicha ruta simplemente marcaremos que si recibimos un GET responderemos con un Hello World:

import spray.routing._
trait ApiRoute extends HttpService {

 val myApiRoute =
   get {
     complete("Hello World!")
   }
}

Como se puede ver, es necesario hacer mixin de HttpService. Además, siempre que queramos devolver alguna respuesta será necesario encapsularlo en un método complete. La parte de spray-routing que utilizamos es la directiva get, que define el comportamiento para las peticiones de tipo GET (muy lógico todo).

Ahora, tenemos que definir un actor que utilice esta ruta. Esto es muy sencillo ya que se basa totalmente en Akka. Lo único raro (o nuevo) es que tendremos que definir su comportamiento basándonos en un método llamado runRoute que define una ruta. ¿Y cuál será dicha ruta? Pues, por supuesto, será la que acabamos de definir en el trait ApiRoute:

import akka.actor.Actor
import spray.routing._

class ApiActor extends Actor with ApiRoute {

  def actorRefFactory = context

  def receive = runRoute(myApiRoute)
}

Ahora queda lanzar la API y atarla a un puerto. Lo primero que necesitaremos realizar es crear un ActorSystem. Una vez creado el ActorSystem, creamos un actor de tipo ApiActor (el actor que acabamos definir en el paso anterior). Finalmente le enviamos un mensaje de tipo Bind indicando la IP y el puerto donde se debe conectar:

import akka.actor.{ ActorSystem, Props }
import akka.io.IO
import akka.util.Timeout
import akka.pattern.ask

import spray.can.Http

import scala.concurrent.duration._

object Main extends App {

  implicit val system = ActorSystem("My-System")
  val apiActor = system.actorOf(Props[ApiActor])

  implicit val timeout = Timeout(3 seconds)

  IO(Http) ? Http.Bind(apiActor, interface = "localhost", port = 8080)

}

Y ya está. Ahora solo queda arrancar la aplicación, abrir nuestro navegador favorito e ir a localhost:8080 para poder ver un maravilloso a la par que sorprendente “HELLO WORLD!” 🙂

tumblr_mamiy1kp641qcp26yo1_400

Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s