Crea un api REST de la forma más simple con Java y Spring Data REST


En posts anteriores se explicó como hacer una API rest utilizando Spring Data, Spring REST y Spring Boot, en este post se explicará una forma aún más simple de hacerlo haciendo uso de Spring Data REST.

1. Configuración

El primer paso será crear un proyecto Maven que tenga como padre el siguiente proyecto:

<parent>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-parent</artifactId>
	<version>1.5.9.RELEASE</version>
</parent>

Una vez que se definió el padre se deben definir las siguientes dependencias:

<dependencies>
	<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-data-rest</artifactId>
	</dependency>
	<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-data-jpa</artifactId>
	</dependency>
	<dependency>
		<groupId>mysql</groupId>
		<artifactId>mysql-connector-java</artifactId>
		<scope>provided</scope>
	</dependency>
</dependencies>

El último paso es definir un plugin de Maven:

<build>
	<plugins>
		<plugin>
			<artifactId>maven-compiler-plugin</artifactId>
			<configuration>
				<source>1.8</source>
				<target>1.8</target>
			</configuration>
		</plugin>
	</plugins>
</build>

2. Creación de tabla y creación de datos de prueba

Para exponer información en nuestra api es necesario crear una tabla donde almacenar nuestros registros y algunos registros de prueba, a continuación se muestra la tabla:

CREATE TABLE USER(
USER_ID INTEGER PRIMARY KEY AUTO_INCREMENT,
USERNAME VARCHAR(100) NOT NULL,
PASSWORD VARCHAR(100) NOT NULL
);

Y la inserción de algunos datos de prueba:

INSERT INTO USER (USERNAME,PASSWORD)VALUES('raidentrance','superSecret');
INSERT INTO USER (USERNAME,PASSWORD)VALUES('john','smith');
INSERT INTO USER (USERNAME,PASSWORD)VALUES('juan','hola123');

Con esto tendremos una tabla para almacenar nuestros registros y una lista de registros de prueba.

3. Creación de entidades

Una vez que el proyecto cuenta con las dependencias necesarias, los siguientes pasos son simples, el primero será crear una entidad que represente la tabla que se creó en nuestra base de datos:


import java.io.Serializable;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;

/**
 * @author raidentrance
 *
 */
@Entity
@Table(name = "USER")
public class User implements Serializable {
	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	@Column(name = "USER_ID")
	private Integer idUser;

	@Column(name = "USERNAME")
	private String username;

	@Column(name = "PASSWORD")
	private String password;

	private static final long serialVersionUID = -5290198995172316155L;

	public Integer getIdUser() {
		return idUser;
	}

	public void setIdUser(Integer idUser) {
		this.idUser = idUser;
	}

	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;
	}

	@Override
	public String toString() {
		return "User [idUser=" + idUser + ", username=" + username + "]";
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((idUser == null) ? 0 : idUser.hashCode());
		result = prime * result + ((username == null) ? 0 : username.hashCode());
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		User other = (User) obj;
		if (idUser == null) {
			if (other.idUser != null)
				return false;
		} else if (!idUser.equals(other.idUser))
			return false;
		if (username == null) {
			if (other.username != null)
				return false;
		} else if (!username.equals(other.username))
			return false;
		return true;
	}

}

Esta clase Java será la forma de representar los registros de la base de datos en objetos Java.

4 Creación de Repositorio JPA

Una vez que tenemos la entidad User el siguiente paso es crear un repositorio JPA, para hacerlo solo es necesario crear una interfaz que herede de PagingAndSortingRepository y listo.


import org.springframework.data.repository.PagingAndSortingRepository;

import com.raidentrance.sd.entities.User;

/**
 * @author raidentrance
 *
 */
public interface UserRepository extends PagingAndSortingRepository<User, Integer>{
}

Es importante mencionar que no debemos crear una implementación de la interfaz UserRepository, esto debido a que Spring data la creará por si mismo.

5 Creando clase de aplicación y definiendo las propiedades

El último paso será crear un archivo properties con la información de nuestra base de datos y del api que creamos:

spring.data.rest.basePath=/api

spring.datasource.url=jdbc:mysql://localhost:3306/spring_boot_users
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.jdbc.Driver

La propiedad spring.data.rest.basePath representa la url base donde se montarán nuestros servicios.

Por último crearemos la clase aplicación que será la que ejecutaremos para ver nuestras api’s:


import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

/**
 * @author raidentrance
 *
 */
@SpringBootApplication
public class SpringDataRestApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringDataRestApplication.class, args);
    }
}

La clase SpringDataRestApplication será la que ejecutaremos para ver nuestras apis.

6 Analizando la salida

Una vez que ejecutamos la clase SpringDataRestApplication veremos lo siguiente en la url http://localhost:8080/api/users.

{
    "_embedded": {
        "users": [
            {
                "username": "raidentrance",
                "password": "superSecret",
                "_links": {
                    "self": {
                        "href": "http://localhost:8080/api/users/1"
                    },
                    "user": {
                        "href": "http://localhost:8080/api/users/1"
                    }
                }
            },
            {
                "username": "john",
                "password": "smith",
                "_links": {
                    "self": {
                        "href": "http://localhost:8080/api/users/2"
                    },
                    "user": {
                        "href": "http://localhost:8080/api/users/2"
                    }
                }
            },
            {
                "username": "juan",
                "password": "hola123",
                "_links": {
                    "self": {
                        "href": "http://localhost:8080/api/users/3"
                    },
                    "user": {
                        "href": "http://localhost:8080/api/users/3"
                    }
                }
            }
        ]
    },
    "_links": {
        "self": {
            "href": "http://localhost:8080/api/users{?page,size,sort}",
            "templated": true
        },
        "profile": {
            "href": "http://localhost:8080/api/profile/users"
        }
    },
    "page": {
        "size": 20,
        "totalElements": 3,
        "totalPages": 1,
        "number": 0
    }
}

Como podemos ver Spring Data REST creó los servicios para obtener, crear, borrar, etc. información de nuestra base de datos, siguiendo buenas prácticas e implementando HATEAS en unas simples líneas de código.

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

2 Comentarios »

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 )

Conectando a %s