Publicado el 21 de Enero del 2019
462 visualizaciones desde el 21 de Enero del 2019
301,2 KB
14 paginas
Experto Universitario Java Enterprise
Spring
Sesión 4
Aplicaciones AJAX y REST
Experto Universitario Java Enterprise
Puntos a tratar
• AJAX con Spring MVC
• Enviar fragmentos de HTML/objetos al cliente
• Recibir objetos del cliente
• Servicios web REST
• Repaso de la filosofía REST
• Obtener recursos (GET)
• Crear o modificar recursos (POST/PUT)
• Eliminar recursos (DELETE)
• Parte del cliente
Tratamiento de errores en AJAX y REST
•
Spring
© 2012-2013 Depto. Ciencia de la Computación e IA
AJAX y REST con Spring
2
Experto Universitario Java Enterprise
Serialización de objetos en la petición/respuesta
HTTP
• Ya hemos visto que la conversión de parámetros HTTP a objeto Java es automática
•
Los encargados de serializar/deserializar de HTTP en Spring son los
HttpMessageConverter
• Por defecto el de XML ya está implementado en Spring, solo sería necesario anotar el objeto
con JAXB
• Simplemente incluyendo en el classpath la librería open source Jackson (http://
jackson.codehaus.org), podemos convertir de/a JSON
•
•
@RequestBody anotando un parámetro de un método indica que queremos
deserializar el cuerpo de la petición HTTP y convertirlo al tipo del parámetro
@ResponseBody anotando el valor de retorno de un método indica que queremos
serializar el valor en el cuerpo de la respuesta HTTP
•
Spring
© 2012-2013 Depto. Ciencia de la Computación e IA
AJAX y REST con Spring
3
Experto Universitario Java Enterprise
AJAX: enviar fragmentos de HTML al cliente
Spring
© 2012-2013 Depto. Ciencia de la Computación e IA
AJAX y REST con Spring
4
<form id="registro" action="#"> Login: <input type="text" name="login" id="campo_login"> <span id="mensaje"></span><br> Password: <input type="password" name="password"> <br> Nombre y apellidos: <input type="text" name="nombre"> <br> <input type="submit" value="registrar"></form><script type="text/javascript"> $('#campo_login').blur( function() { $('#mensaje').load('loginDisponible.do', "login="+$('#campo_login').val()) } )</script>@RequestMapping("/loginDisponible.do") public @ResponseBody String loginDisponible(@RequestParam("login") String login) { if (ubo.getUsuario(login)==null) return "login disponible"; else return "login <strong>no</strong> disponible"; }
Experto Universitario Java Enterprise
AJAX (II): enviar objetos al cliente
• Para enviar JSON, simplemente incluir la dependencia de Jackson
• Para enviar XML, anotar la clase InfoLogin con JAXB
Spring
© 2012-2013 Depto. Ciencia de la Computación e IA
AJAX y REST con Spring
5
public @ResponseBody InfoLogin loginDisponible(@RequestParam("login") String login) { if (ubo.getUsuario(login)==null) //Si está disponible, no hacen falta sugerencias return new InfoLogin(true, null); else //si no lo está, generamos las sugerencias con la ayuda del IUsuarioBO return new InfoLogin(false, ubo.generarSugerencias(login));}@XmlRootElementpublic class InfoLogin { private boolean disponible; private List<String> sugerencias; @XmlElement public boolean isDisponible() { return disponible; } ...}
Experto Universitario Java Enterprise
AJAX (III): Recibir objetos del cliente
Spring
© 2012-2013 Depto. Ciencia de la Computación e IA
AJAX y REST con Spring
6
@RequestMapping("/altaUsuario.do")public void altaUsuario(@RequestBody Usuario usuario) { ...}<form id="registro" action="#"> Login: <input type="text" name="login" id="login"> <span id="mensaje"></span><br> Password: <input type="password" name="password" id="password"> <br> Nombre y apellidos: <input type="text" name="nombre" id="nombre"> <br> <input type="submit" value="registrar"></form><script type="text/javascript"> $('#registro').submit(function(evento) { $.ajax({ url: 'altaUsuario.do', type: 'POST', data: JSON.stringify({login: $('#login').val(), password: $('#password').val(), nombre: $('#nombre').val()}), processData: false, contentType: "application/json" }) evento.preventDefault(); });</script>
Experto Universitario Java Enterprise
Servicios Web REST: repaso
• Cada URI identifica un recurso (entidad, objeto)
• Se suelen organizar de manera jerárquica
• El método HTTP indica qué operación queremos realizar sobre el recurso
•
La respuesta del servidor se acompaña de un código de estado HTTP
•
•
404 recurso inexistente
400 petición incorrecta
Spring
© 2012-2013 Depto. Ciencia de la Computación e IA
AJAX y REST con Spring
7
/hoteles/excelsiorMad/ofertas/15/hoteles/ambassador03/ofertas/15 /hoteles/ambassador03/ofertas/ (todas las del hotel)GET /hoteles/excelsiorMad/ofertas/15 ver la ofertaGET /hoteles/excelsiorMad/ofertas/ ver todas las ofertas del hotelPOST /hoteles/excelsiorMad/ofertas/15 crear la ofertaPUT /hoteles/excelsiorMad/ofertas/15 actualizar la ofertaDELETE /hoteles/excelsiorMad/ofertas/15 eliminar la oferta
Experto Universitario Java Enterprise
URIs y PathVariables (@PathParam en JAX-RS)
• El diseño de las URIs REST hace que hayan partes fijas y partes variables. Nos
interesa saber el valor de esas partes variables
Spring
© 2012-2013 Depto. Ciencia de la Computación e IA
AJAX y REST con Spring
8
/hoteles/excelsiorMad/ofertas/15/hoteles/{idHotel}/ofertas/{idOferta} @Controllerpublic class OfertaRESTController { @Autowired IOfertasBO obo; @RequestMapping(value="hoteles/{idHotel}/ofertas/{idOferta}", method=RequestMethod.GET) @ResponseBody public Oferta mostrar(@PathVariable String idHotel, @PathVariable int idOferta) { Oferta oferta = obo.getOferta(idHotel, idOferta); return oferta; }}
Experto Universitario Java Enterprise
Obtener recursos: GET
•
•
ResponseEntity<Clase> representa una respuesta HTTP en la que se serializa
un objeto de la clase Clase. Para no serializar nada, ResponseEntity<Void>
También se podría usar @ResponseBody, pero la convención en Spring es usar esto
para REST
Spring
© 2012-2013 Depto. Ciencia de la Computación e IA
AJAX y REST con Spring
9
@Controller@RequestMapping("/hoteles/{idHotel}/ofertas")public class OfertasController { @Autowired IOfertasBO obo; @RequestMapping(method=RequestMethod.GET, value="{idOferta}", produces=MediaType.APPLICATION_JSON_VALUE) public ResponseEntity<Oferta> obtenerOferta(@PathVariable String idHotel, @PathVariable int idOferta) throws OfertaInexistenteException { Oferta oferta = obo.getOferta(idHotel, idOferta); return new ResponseEntity<Oferta>(oferta, HttpStatus.OK); }}
Experto Universitario Java Enterprise
Crear/modificar recursos (POST/PUT)
Spring
© 2012-2013 Depto. Ciencia de la Computación e IA
AJAX y REST con Spring
10
@RequestMapping("/hoteles/{idHotel}/ofertas")public class OfertasController { @Autowired IOfertasBO obo; //Ya no se muestra el código de obtenerOferta //... @RequestMapping(method=RequestMethod.POST, value="") public ResponseEntity<Void> insertarOferta(@PathVariable idHotel, @RequestBody Oferta oferta, HttpServletRequest peticion) { int idOFerta = obo.crearOferta(idHotel, oferta); HttpHeaders cabeceras = new HttpHeaders(); try { cabeceras.setLocation(new URI(peticion.getRequestURL()+ Integer.toString(idOFerta))); } catch (URISyntaxException e) { e.printStackTrace(); } return new ResponseEntity<Void>(cabeceras, HttpStatus.CREATED); }}
Experto Universitario Java Enterprise
Eliminar recursos (DELETE)
Spring
© 2012-2013 Depto. Ciencia de la Computación e IA
AJAX y REST con Spring
11
@RequestMapping(method=RequestMethod.DELETE, value="{idOferta}")public ResponseEntity<Void> borrarOferta(@PathVariable idHotel, @PathVariable idOferta) { obo.eliminarOferta(idHotel, idOferta); return new ResponseEntity<Void>(HttpStatus.OK);}
Experto Universitario Java Enterprise
Clientes REST
• En principio se puede programar un cliente REST con JavaSE estándar, pero es
tedioso
• Hay librerías como Jakarta Commons HttpClient, que facilitan la tarea, además de
implementar autentificación BASIC y otras características
• Spring proporciona RestTemplate
Spring
© 2012-2013 Depto. Ciencia de la Computación e IA
AJAX y REST con Spring
12
RestTemplate template = new RestTemplate();String uri = "http://localhost:8080/ServidorREST/hoteles/{idHotel}/ofertas/{idOferta}";Oferta oferta = template.getForObject(uri, Oferta.class, "ambassador", 1);System.out.println(oferta.getPrecio() + "," + oferta.getFin());RestTemplate template = new RestTemplate();String uri = "http://localhost:8080/TestRESTSpring3/hoteles/{idHotel}/ofertas";//aquí le daríamos el valor deseado a los campos del objetoOferta oferta = new Oferta( ..., ..., ...);URI result = template.postForLocation(uri, oferta, "ambassador");
Experto Universitario Java Enterprise
Tratamiento de errores en AJAX y REST
• Si un método de un Controller lanza una excepción, por defecto se le envía al cliente
en la respuesta HTTP, lo que no es muy apropiado
Tampoco es apropiado para un cliente AJAX o REST saltar a una página de error
JSP o HTML (típico en operaciones no AJAX)
•
• Podemos convertir ciertas excepciones en códigos de estado HTTP con un método
del controller anotado con @ExceptionHandler
• De hecho, Spring ya
Comentarios de: Spring - Sesión 4 Aplicaciones AJAX y REST (0)
No hay comentarios