Developer's Diary

21 julio, 2013

[#Scala] Mis aventuras con Scala II

Hola de nuevo,

Como prometí hace unas semanas atrás, pasamos a comprobar como podemos usar dentro de nuestra aplicación de Play mediante Scala el uso de MongoDB.

Para poder comenzar a usar MongoDB dentro de nuestro proyecto de Scala, lo primero que debemos hacer es agregar un driver para poder conectar. En este caso, vamos a usar Casbah se trata del driver oficial de MongoDB.

Para agregarlo debemos hacer los siguientes pasos:

1) Agregar la siguiente referencia “org.mongodb” %% “casbah” % “2.6.2” al fichero Build.scala de nuestro proyecto en el apartado val appDependencies = Seq(
2) Debemos arrancar la app en play.
3) Si usamos algún tipo de IDE como Eclipse o JIdea, debemos lanzar dentro de la consola de Play de nuevo la preparación del proyecto. Escribiendo Eclipse o Idea.

Tras estos pasos, tenemos nuestro proyecto preparado para consumir base de datos.

Debemos recordar activar nuestro servidor de Mongo.

Dentro de nuestro proyecto de Scala, en los objetos que vayamos a usar la base de datos, import com.mongodb.casbah._

Cuando queremos realizar una operación CRUD dentro de nuestra base de datos. Debemos usar el objeto MongoClient, este nos activa la conexión con la base de datos, eligimos base de datos y colección con la que vayamos a trabajar. Desde MongoDB se trabaja con colecciones, que es la similitud con las tablas en las bases de datos relacionales.

Para poder conectarnos a nuestra base de datos mongo, tenemos varios métodos, aunque vamos a destacar dos.

1) Conexión por dirección y puerto.

Podemos indicarle al driver hacia que dirección ip y que puerto debe dirigirse.


val client = MongoClient("127.0.0.1" , 27071)

Con esa línea tendríamos un cliente apuntando a los valores por defecto de nuestra conexión local.

2) Conexión mediante URI

Podemos indicar una Uri con toda la información de nuestra conexión que tendría la siguiente estructura.

“mongodb://:@:/”

En ese caso si quisiesemos conectarnos a la base de datos local anteriormente citada la uri quedaría más o menos así:


val client = MongoClient(MongoClientURI("mongodb://127.0.0.1:27071"))

Descartamos usuario y contraseña y la base de datos porque no queremos detallar tales datos de conexión.

Después de esto, vamos a pasar a ver como se podría hacer una consulta o una insercción.

Para lo que se asemejería a un Select * From. Debemos usar como sabeis la instrucción find de la colección. Pues si la lanzaramos a la base de datos local, como hacíamos antes. Sería algo así.

val client = MongoClient("127.0.0.1" , 27071)

var jsonList = List[JsValue]()

for(user user.get("Param1").asInstanceOf[String]
obj += "Param2" -> user.get("Param2").asInstanceOf[String]
obj += "Param3" -> user.get("Param3").asInstanceOf[Int]

jsonList ::= Json.parse(obj.result().toString())
}

client.close()
Ok(JsArray(jsonList)).as("application/json")
}

Vamos a explicar este fragmento de código más detenidamente. Como podemos ver, creamos la colección, posteriormente declaramos una lista de JsValue, para devolver los datos después.

Vamos recorriendo el contenido de nuestra lista, creamos un objeto de MongoObject para introducir toda la información y posteriormente la guardamos en nuestra lista con formato Json. Cuando terminamos de recorrer la lista, cerramos la conexión y devolvemos los datos.

Para el insert es muy similar, dentro de la petición Http debe ser POST, ya que vamos a realizar una inserción.

def Add(param1: String , param2 : String , param3 : Int) = Action {

val client = MongoClient("127.0.0.1" , 27071)

val objs = client("MyDatabase")("MyCollection")

val obj = MongoDBObject.newBuilder

obj += "Param1" -> param1
obj += "Param2" -> param2
obj += "Param3" -> param3

val result = objs.insert(obj.result()).getError()

if(result == null)
{
Ok("")
}
else
{
BadRequest(result.toString())
}
}

Como podeis ver tiene muchas similitudes con el código de ejemplo para la consulta.

Abrimos la conexión, creamos un objeto de tipo MongoObject para insertar todos los parametros que necesitamos y posteriormente ejecutamos el método insert, con referencia del objeto MongoObject que hemos creado previamente para su insercción.

Introducimos en una variable si hubo algún tipo de error en la inserción, en caso de que el valor sea null, todo ha ido correctamente. En caso contrario enviamos el mensaje de error producido.

Hasta aquí el proceso de consulta e insercción simple.

Como podeis ver es muy sencillo y es casi como si estuviesemos trabajando con la consola de mongo directamente. También podemos encontrar llamadas tales como findOne o findById para el tema de las consultas.

Por último, si queremos consumir nuestro RestAPI hecho en Play, en Windows Phone, solo necesitamos recurrir al anterior capitulo para las peticiones Get, pero para las peticiones POST deberemos usar un HttpWebRequest, aquí teneis un ejemplo para usar el fragmento de código anterior.

public void Post(string url, string contentType , Action actionResponse)
{
var request = (HttpWebRequest)WebRequest.Create(url);

request.ContentType = contentType;
request.Method = "POST";

request.BeginGetResponse((resultResponse) =>
{
var beginResponse = (HttpWebRequest)resultResponse.AsyncState;
var response = (HttpWebResponse)beginResponse.EndGetResponse(resultResponse);
var streamResponse = response.GetResponseStream();

actionResponse.Invoke(streamResponse);
}, request);
}

Hay que tener en cuenta que estamos pasando los parametros de nuestra solicitud por mediación de la Url, es por eso que no debemos escribir nada dentro del RequestStream.

También teneis que ver que pasamos un parametro al método llamado Action, lo hemos introducido para consumir posteriormente esta consulta y recuperar los datos, que recibamos dentro de la petición POST.

Hasta que ha terminado nuestra segunda aventura con Scala, en la siguiente aventura, continuaremos con Mongo, pero en esta ocasión introduciremos imagenes y ficheros dentro de nuestra base de datos.

Hasta la proxima.

Anuncios

Dejar un comentario »

Aún no hay comentarios.

RSS feed for comments on this post. TrackBack URI

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

A %d blogueros les gusta esto: