Aplicación en Spring REST y Angular – 4ª Parte

Continuo con la serie de artículos explicando una aplicación donde la parte de servidor esta creada con Java, apoyándose en el framework Spring y la parte del cliente usara Angular. Para la comunicación entre la aplicación usare peticiones REST, por supuesto utilizando el protocolo JSON.

En la anterior entrada empece a explicar como se desplegaría la aplicación y en que URLs se procesarían las diferentes peticiones. Ahora explicare como funcionan las diferentes peticiones.

En la clase YagesController  es donde se hace toda la magia 😉

@RestController
@RequestMapping("/rest")
public class YagesController {

	@Autowired
	private YagesBussines yagesBussines;

	@RequestMapping(value = "/{anoId}", method=RequestMethod.GET,
            produces="application/json")
	public VentasAnoBean getAno(@PathVariable int anoId) {
		System.out.println("getAno.Año: "+anoId);
		return yagesBussines.getVentasAno(anoId);
	}
	
	@RequestMapping(value ="/{anoId}/{mesId}", method=RequestMethod.GET,produces="application/json")
	public ArrayList<VentasSemanaBean> getSemanas(@PathVariable int anoId,@PathVariable int mesId)	
	{
		 System.out.println("GetSemanas. Mes "+mesId+" Año: "+anoId);
		 return yagesBussines.getDatosSemana(mesId, anoId);
	}
}

Como ya comente, lo primero es la anotación @RestController, que le dice a Spring que nuestra clase va a procesar peticiones tipo REST. A continuación, la anotación  @RequestMapping(“/rest”) especifica que debe responder a las peticiones que vayan a la URL /rest 

Como dije en la entrada anterior, por claridad en los ejemplos vamos a suponer que nuestra aplicación responde en la dirección (URL) : http://localhost:8080/yagesserver . Aclarar, que el 8080 es el puerto donde escuchara y yagesserver es el directorio o contexto base donde estará nuestra aplicación.

La clase  define un único objeto tipo YagesBussines  a través del sistema de inyección de Spring y tiene dos funciones, que explico a continuación:

  • Función: getAno

	@RequestMapping(value = "/{anoId}", method=RequestMethod.GET,
            produces="application/json")
	public VentasAnoBean getAno(@PathVariable int anoId) {
		System.out.println("getAno.Año: "+anoId);
		return yagesBussines.getVentasAno(anoId);
	}

Como se ve, la función esta anotada con la directiva @RequestMapping. Con esta directiva vamos a especificar que dirección (dentro de /rest/ )  vamos a tratar en esta función. Así, en este caso le decimos que vamos a procesar aquellas peticiones que tengan un solo parámetro y, que ademas,  la petición sea del tipo GET. También especificamos que la respuesta a la petición sera del tipo application/json.

Es decir, el esta función sera llamada ( y su código ejecutado ) cuando hagamos una petición del tipo http://localhost:8080/yagesserver/rest/2018 . Aclarar que no sera llamada si el numero de parámetros no es exactamente uno. Por ejemplo esta petición http://localhost:8080/yagesserver/rest/2018/2 no sera tratada ya que recibe dos parámetros  (2018 y 2).

Cuando definimos la función, se añade la anotación @PathVariable que indica que la variable puesta a continuación deberá contener el parámetro de la URL. Así en la petición http://localhost:8080/yagesserver/rest/2018  nuestra variable anoId tendrá el valor 2018. Lógicamente, esto obliga a que el parámetro sea del tipo entero, pues hemos definido que nuestra variable anoId es del tipo int.

Esta función, devuelve un objeto VentasAnoBean que esta definida en la siguiente clase:

@Data
public class VentasAnoBean {
   private ArrayList<VentasMesBean> ventasMes = new ArrayList();
   private double kilosVentaAct, impVentaAct, kilosVentaAnt, impVentaAnt,gananciaAct,gananciaAnt;
....
}

Como se ve, la clase es una simple clase POJO, con unas variables, accesibles a través de sus correspondientes métodos getter, que la librería Lombok, a través de la anotación @Data creara. Teneis mas detalles de la librería  Lombok en otra entrada de mi pagina.

Al haber  especificado que debe devolver un objeto con la codificación json,  Spring, apoyándose en las librerías  de jackson, devolverá la correspondiente cadena de texto, formateada adecuadamente. No voy a hablar de como  se codifica o descodifica una cadena JSON  en esta entrada y realmente tampoco nos importa. De eso ya se encargaran las correspondientes librerías. Lo que importa es que esta función un objeto del tipo VentasAnoBean en un formato que luego una aplicación cliente va a saber reconstruir.

 

Aquí se ve una captura de pantalla de como accediendo a la URL:

http://localhost:8080/yagesserver/rest/2018 es devuelto un objeto VentasAnoBean, que incluye un array de objetos tipo ventasMes, y las variables kilosVentaAct, impVentaAct, kilosVentaAnt, impVentaAnt,gananciaAct y gananciaAnt.

 

 

 

 

 

 

 

 

 

 

 

Si usamos el comando curl, para hacer la petición HTTP, veremos que la salida, en crudo,  seria la siguiente:

  • Función: getSemanas

@RequestMapping(value ="/{anoId}/{mesId}",
           method=RequestMethod.GET, 
           produces="application/json")
	public ArrayList<VentasSemanaBean> getSemanas(@PathVariable int anoId,@PathVariable int mesId)	
	{
		 System.out.println("GetSemanas. Mes "+mesId+" Año: "+anoId);
		 return yagesBussines.getDatosSemana(mesId, anoId);
	}

En esta función se van a tratar todas aquellas peticiones como la siguiente localhost:8080/yagessever/rest/2018/2 es decir, aquellas que tengan dos parametros.

Esto se especifica por la anotación @RequestMapping donde especificamos que el valor debe ser “/{anoId}/{mesId}”, despues, en la declaración de nuestra función, especificamos en que variables deben ser introducidos los parámetros de la URL. Así, el primer parámetro sera introducido en la variable anoId y el segundo, en la variable mesId.

Esta función devuelve un Array de objetos tipo VentasSemanaBean, que no es sino un simple POJO definido en la siguiente clase:

@Data
public class VentasMesBean {
    private int ano, mes;
    private double kilosVentaAct, impVentaAct, kilosVentaAnt, impVentaAnt;
    private double gananAct, gananAnt;
....
}

Si realizamos una petición, usando curl, obtendremos la siguiente salida:

En la ultima entrada  de la parte servidor, explicare como se consiguen los objetos  VentasMesBeanVentasAnoBean.

¡¡ Hasta pronto !!

 

Deja un comentario

English English Spanish Spanish