Crea web services REST utilizando Vert.x


Si escuchaste en algún lugar que Vert.x es un gran framework y quieres empezar a utilizarlo para tus aplicaciones, este post es la guía perfecta para eso.

Paso 1 Configuración

Veamos el archivo pom.xml.

La configuración anterior agrega la dependencia de Vertx al proyecto y define la versión 1.8 de java como la versión a utilizar en el proyecto(Vertx solo funciona con Java 1.8 o superior).

Paso 2 Creando el modelo de la aplicación

En este ejemplo mostraremos como buscar uno, buscar todos, crear y borrar un objeto User de una lista, el primer paso será crear la clase User.


import java.io.Serializable;

/**
 * @author raidentrance
 *
 */
public class User implements Serializable {
	private String username;
	private String password;

	private static final long serialVersionUID = -8672858398542565036L;

	public User() {
	}

	public User(String username, String password) {
		this.username = username;
		this.password = password;
	}

	public String getUsername() {
		return username;
	}

	public void setUsername(String username) {
		this.username = username;
	}

	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}

}

La clase User contendrá los atributos username y password.

Paso 3 Creando un UserService

Una vez que se creó el modelo el siguiente paso será crear una clase llamada UserService, la cuál será la responsable de ejecutar la lógica de negocio de nuestros endpoints, en este ejemplo no utilizaremos una base de datos, solo tendremos algunos usuarios en memoria, con los siguientes métodos:

  • List findAll(): Devuelve todos los usuarios en la lista
  • Optional findByUsername(String username): Devuelve a un objeto usuario basado en el username

  • void create(User user): Agrega un usuario nuevo a la lista

UserService.java


import java.util.ArrayList;
import java.util.List;
import java.util.Optional;

import com.raidentrance.model.User;

/**
 * @author raidentrance
 *
 */
public class UserService {
	private List users = new ArrayList();

	public UserService() {
		users.add(new User("raidentrance", "superSecret"));
		users.add(new User("root", "superExtraSecret"));
		users.add(new User("dummy", "notSecret"));
	}

	public List findAll() {
		return users;
	}

	public Optional findByUsername(String username) {
		for (User user : users) {
			if (user.getUsername().equals(username)) {
				return Optional.of(user);
			}
		}
		return Optional.empty();
	}

	public void create(User user) {
		users.add(user);
	}
}

Hasta este punto no hemos utilizado para nada Vertx, el siguiente paso será exponer la clase UserService como una api REST.

Paso 4 Exponiendo las apis vía REST

El siguiente paso será exponer los métodos mencionados anteriormente como api’s REST:

UserResource.java


import java.util.Optional;

import com.raidentrance.model.User;
import com.raidentrance.services.UserService;

import io.vertx.core.AbstractVerticle;
import io.vertx.core.Future;
import io.vertx.core.json.Json;
import io.vertx.ext.web.Router;

/**
 * @author raidentrance
 *
 */
public class UserResource extends AbstractVerticle {

	private UserService service = new UserService();

	@Override
	public void start(Future fut) {
		Router router = Router.router(vertx);
		router.get("/users")
				.handler(routingContext -> routingContext.response()
						.putHeader("content-type", "application/json; charset=utf-8")
						.end(Json.encodePrettily(service.findAll())));

		router.get("/users/:username").handler(routingContext -> {
			Optional result = service.findByUsername(routingContext.request().getParam("username"));
			if (result.isPresent()) {
				routingContext.response().setStatusCode(200)
						.putHeader("content-type", "application/json; charset=utf-8").end(Json.encode(result.get()));
			} else {
				routingContext.response().setStatusCode(404);
			}
		});
		router.post("/users").handler(routingContext -> {
			User user = Json.decodeValue(routingContext.getBodyAsString(), User.class);
			service.create(user);
			routingContext.response().setStatusCode(201).putHeader("content-type", "application/json; charset=utf-8")
					.end(Json.encodePrettily(user));
		});
		vertx.createHttpServer().requestHandler(router::accept).listen(config().getInteger("http.port", 8080),
				result -> {
					if (result.succeeded()) {
						fut.complete();
					} else {
						fut.fail(result.cause());
					}
				});
	}

}

Como se puede ver se creará un objeto router basado en el objeto vertx, en el cuál se agregarán las siguientes rutas:

  • router.get(/users) : Devuelve todos los objetos User en la lista

  • router.get(/users/:username): Devuelve al usuario cuyo username sea pasado como parámetro en caso de no existir alguno devuelve un status http 404.

  • router.post(/users):Add a new user to the list

Al final se creará un servidor http y se iniciará en el puerto definido.

Paso 5 Ejecutando la aplicación

El último paso será iniciar nuestra aplicación, para esto crearemos un objeto Vertx y desplegaremos el Verticle creado.


import com.raidentrance.resources.UserResource;

import io.vertx.core.Vertx;

/**
 * @author raidentrance
 *
 */
public class VertxApplication {
	private VertxApplication() {
	}

	public static void main(String[] args) {
		Vertx vertx = Vertx.vertx();
		vertx.deployVerticle(UserResource.class.getName());
	}
}

Una vez que se ejecuta la clase VertxApplication, el siguiente paso será validar las apis utilizando algún cliente HTTP accediendo a las siguientes url’s:

[
   {
      username:"raidentrance",
      password:"superSecret"
   },
   {
      username:"root",
      password:"superExtraSecret"
   },
   {
      username:"dummy",
      password:"notSecret"
   }
]
{
     username: "raidentrance",
     password: "superSecret"
}
{
     username: "raidentrance",
     password: "superSecret"
}

Puedes encontrar el código completo en el siguiente enlace https://github.com/raidentrance/vertx-example.

Si te gusta el contenido y quieres enterarte cuando realicemos un post nuevo síguenos en nuestras redes sociales https://twitter.com/geeks_mx y https://www.facebook.com/geeksJavaMexico/.

Autor: Alejandro Agapito Bautista

Twitter: @raidentrance

Contacto:raidentrance@gmail.com

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 )

Google+ photo

Estás comentando usando tu cuenta de Google+. 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 )

w

Conectando a %s