apuntes:serviciosweb
Differences
This shows you the differences between two versions of the page.
apuntes:serviciosweb [17/07/2020 10:16] – created Santiago Faci | apuntes:serviciosweb [17/07/2020 10:16] (current) – removed Santiago Faci | ||
---|---|---|---|
Line 1: | Line 1: | ||
- | ====== Spring: Creación de servicios web ====== | ||
- | ==== ¿Qué son los servicios web? ==== | ||
- | |||
- | Un servicio web es una aplicación que se encuentra en el lado servidor y permite que otra aplicación cliente conecte con ella a través de Internet para el intercambio de información utilizando el protocolo HTTP. | ||
- | |||
- | Una de las principales características de los servicios web es que no es necesario que ambas aplicaciones (servidor y cliente) estén escritas en el mismo, lo que hace que la interoperabilidad sea máxima. Por ejemplo, podríamos crear un servicio web en Python y utilizarlo conectándonos desde una aplicación móvil con Android, desde otra aplicación programada en Java o incluso desde otro servicio web escrito con .NET. | ||
- | |||
- | Además, utilizan el protocolo HTTP para el intercambio de información, | ||
- | |||
- | < | ||
- | {{ web_service_internet.jpg }} | ||
- | < | ||
- | </ | ||
- | |||
- | ==== REST Web Service ==== | ||
- | |||
- | Los Servicios Web REST son Servicios Web que cumplen una serie de requisitos según un patrón de arquitectura definida hacia el año 2000 y que se ha extendido siendo el patrón predominante a la hora de implementar este tipo de aplicaciones. | ||
- | |||
- | Básicamente consiste en seguir una serie de reglas que definen dicha arquitectura. Entre ellas están el uso del procotolo HTTP por ser el más extendido a lo largo de Internet en la actualidad. Además, cada recurso del servicio web tiene que ser identificado por una dirección web (una URL) siguiendo una estructura determinada. Además, la respuesta tendrá que tener una estructura determinada en forma de texto que normalmente vendrá en alguno de los formatos abiertos más conocidos como XML o JSON. | ||
- | |||
- | < | ||
- | {{ urls.png }} | ||
- | < | ||
- | </ | ||
- | |||
- | Esas URLs y su estructura son lo que definen lo que se conoce como la API del Servicio Web, que son las diferentes operaciones a las que los clientes tienen acceso para comunicarse con el mismo. En este caso se trata de una API Web. | ||
- | |||
- | === Web API === | ||
- | |||
- | Una Web API es una API (Application Programming Interface) implementada para un Servicio Web de forma que éste puede ser accesible mediante el protocolo HTTP, en principio por cualquier cliente web (navegador) aunque existen librerías que permiten que cualquier tipo de aplicación (escritorio, | ||
- | |||
- | La Web API es una de las partes de los Servicios Web que, tal y como comentabamos anteriormente, | ||
- | |||
- | < | ||
- | {{ web_api2.png }} | ||
- | < | ||
- | </ | ||
- | |||
- | < | ||
- | {{ web_api.png }} | ||
- | < | ||
- | </ | ||
- | |||
- | === JSON === | ||
- | |||
- | <code java> | ||
- | { | ||
- | " | ||
- | " | ||
- | " | ||
- | " | ||
- | " | ||
- | " | ||
- | " | ||
- | " | ||
- | " | ||
- | }, | ||
- | " | ||
- | { | ||
- | " | ||
- | " | ||
- | }, | ||
- | { | ||
- | " | ||
- | " | ||
- | }, | ||
- | { | ||
- | " | ||
- | " | ||
- | } | ||
- | ], | ||
- | " | ||
- | " | ||
- | } | ||
- | </ | ||
- | |||
- | ===== Spring framework ===== | ||
- | |||
- | < | ||
- | {{ spring-logo.png }} | ||
- | < | ||
- | |||
- | [[http:// | ||
- | |||
- | Para eso, lo primero que haremos será utilizar el [[http:// | ||
- | |||
- | Una vez tengamos creado el proyecto inicial, podemos empezar a trabajar en él para tener nuestro servidor. En este caso se trata de crear un servidor que tendrá los servicios web necesarios para que los usuarios de una aplicación Android puedan registrar sus opiniones en nuestra Base de Datos. Así, otros usuarios podrán visualizarlas en sus terminales. | ||
- | |||
- | ==== Configuración del servidor ==== | ||
- | |||
- | Lo primero de todo será editar el fichero de configuración del proyecto para personalizarlo a nuestro caso: | ||
- | |||
- | <file java application.properties> | ||
- | # Configuración para el acceso a la Base de Datos | ||
- | spring.jpa.hibernate.ddl-auto=none | ||
- | spring.jpa.properties.hibernate.globally_quoted_identifiers=true | ||
- | # Puerto donde escucha el servidor una vez se inicie | ||
- | server.port=${port: | ||
- | |||
- | # Datos de conexion con la base de datos MySQL | ||
- | spring.datasource.url=jdbc: | ||
- | spring.datasource.username=root | ||
- | spring.datasource.password= | ||
- | spring.datasource.driverClassName=com.mysql.jdbc.Driver | ||
- | </ | ||
- | |||
- | Sobre el fichero '' | ||
- | |||
- | <file java build.gradle> | ||
- | . . . | ||
- | apply plugin: ' | ||
- | apply plugin: ' | ||
- | apply plugin: ' | ||
- | apply plugin: ' | ||
- | |||
- | jar { | ||
- | baseName = ' | ||
- | version = ' | ||
- | } | ||
- | |||
- | repositories { | ||
- | mavenCentral() | ||
- | } | ||
- | |||
- | dependencies { | ||
- | compile(' | ||
- | compile(' | ||
- | compile(' | ||
- | providedRuntime(" | ||
- | } | ||
- | |||
- | configurations { | ||
- | providedRuntime | ||
- | } | ||
- | </ | ||
- | |||
- | Ahora, modificaremos la clase principal '' | ||
- | |||
- | Conviene prestar atención a los comentarios que he dejado en esta clase, donde se explica cómo lanzar la aplicación servidor una vez que este lista. | ||
- | |||
- | <file java Application.java> | ||
- | /** | ||
- | * Clase que lanza la aplicación | ||
- | * | ||
- | * Cómo compilar/ | ||
- | | ||
- | | ||
- | | ||
- | | ||
- | | ||
- | | ||
- | * | ||
- | | ||
- | | ||
- | | ||
- | * | ||
- | * @author Santiago Faci | ||
- | * @version curso 2015-2016 | ||
- | */ | ||
- | @SpringBootApplication | ||
- | public class Application extends SpringBootServletInitializer { | ||
- | |||
- | public static void main(String[] args) { | ||
- | SpringApplication.run(Application.class, | ||
- | } | ||
- | |||
- | @Override | ||
- | protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { | ||
- | return application.sources(applicationClass); | ||
- | } | ||
- | |||
- | private static Class< | ||
- | } | ||
- | </ | ||
- | |||
- | ==== Definir la Base de Datos ==== | ||
- | |||
- | Hay que tener en cuenta que //Spring// utiliza por debajo el framework de // | ||
- | |||
- | A continuación se muestra el script '' | ||
- | |||
- | <file sql opiniones.sql> | ||
- | CREATE DATABASE IF NOT EXISTS opiniones; | ||
- | USE opiniones; | ||
- | |||
- | CREATE TABLE IF NOT EXISTS opiniones ( | ||
- | id INT UNSIGNED PRIMARY KEY, | ||
- | titulo VARCHAR(50) NOT NULL, | ||
- | texto VARCHAR(50), | ||
- | fecha DATETIME, | ||
- | puntuacion INT UNSIGNED | ||
- | ); | ||
- | </ | ||
- | |||
- | Así, simplemente tenemos que crear la clase con los atributos y métodos que queramos y añadir las anotaciones que orientarán a // | ||
- | |||
- | <code java> | ||
- | import javax.persistence.*; | ||
- | /** | ||
- | * Opinion que los usuarios tienen sobre un monumento | ||
- | * Se deben definir las anotaciones que indican la tabla y columnas a las que | ||
- | * representa esta clase y sus atributos | ||
- | * | ||
- | * @author Santiago Faci | ||
- | * @version curso 2015-2016 | ||
- | */ | ||
- | @Entity | ||
- | @Table(name = " | ||
- | public class Opinion { | ||
- | |||
- | @Id | ||
- | @GeneratedValue | ||
- | private int id; | ||
- | @Column | ||
- | private String titulo; | ||
- | @Column | ||
- | private String texto; | ||
- | @Column | ||
- | private Date fecha; | ||
- | @Column | ||
- | private int puntuacion; | ||
- | |||
- | // Constructor | ||
- | // Getters y Setters | ||
- | . . . | ||
- | } | ||
- | </ | ||
- | |||
- | > **Recordad que todas las anotaciones Java en el ejemplo anterior son clases que pertenecen al paquete ' | ||
- | |||
- | ==== El Acceso a la Base de Datos ==== | ||
- | |||
- | Ahora creamos la '' | ||
- | |||
- | <code java> | ||
- | /** | ||
- | * Clase que hace de interfaz con la Base de Datos | ||
- | * Al heredar de CrudRepository se asumen una serie de operaciones | ||
- | * para registrar o eliminar contenido (save/ | ||
- | * Se pueden añadir operaciones ya preparadas como las que hay de ejemplo ya hechas | ||
- | * | ||
- | * @author Santiago Faci | ||
- | * @version curso 2015-2016 | ||
- | */ | ||
- | public interface OpinionRepository extends CrudRepository< | ||
- | |||
- | List< | ||
- | List< | ||
- | } | ||
- | </ | ||
- | |||
- | ==== Implementación del Controller ==== | ||
- | |||
- | Por último, crearemos la clase que hará de '' | ||
- | |||
- | En este caso hemos creado tres operaciones: | ||
- | |||
- | * getOpiniones(): | ||
- | * getOpiniones(int puntuacion): | ||
- | * addOpinion(String titulo, String texto, int puntuacion): | ||
- | |||
- | Cada una de las operaciones tienen una URL de mapeo que nos permite acceder a las mismas desde cualquier cliente (navegador, aplicación Java, aplicación Android). Por ejemplo, si quisieramos obtener todas las opiniones que tienen una determinada puntuación utilizaríamos la siguiente URL: http:// | ||
- | |||
- | * http:// | ||
- | * http:// | ||
- | * http:// | ||
- | * http:// | ||
- | |||
- | <code java> | ||
- | /** | ||
- | * Controlador para las opiniones | ||
- | * Contendrá todos los métodos que realicen operaciones sobre opiniones de los usuarios | ||
- | * | ||
- | * @author Santiago Faci | ||
- | * @version curso 2015-2016 | ||
- | */ | ||
- | @RestController | ||
- | public class OpinionController { | ||
- | |||
- | @Autowired | ||
- | private OpinionRepository repository; | ||
- | |||
- | /** | ||
- | * Obtiene todas las opiniones de los usuarios | ||
- | * @return | ||
- | */ | ||
- | @RequestMapping("/ | ||
- | public List< | ||
- | |||
- | List< | ||
- | return listaOpiniones; | ||
- | } | ||
- | |||
- | /** | ||
- | * Obtiene todas las opiniones con una puntuacion determinada | ||
- | * @param puntuacion | ||
- | * @return | ||
- | */ | ||
- | @RequestMapping("/ | ||
- | public List< | ||
- | |||
- | List< | ||
- | return listaOpiniones; | ||
- | } | ||
- | |||
- | /** | ||
- | * Registra una nueva opinión en la Base de Datos | ||
- | * @param titulo | ||
- | * @param texto | ||
- | * @param puntuacion | ||
- | */ | ||
- | @RequestMapping("/ | ||
- | public void addOpinion(@RequestParam(value = " | ||
- | | ||
- | | ||
- | |||
- | Opinion opinion = new Opinion(); | ||
- | opinion.setTitulo(titulo); | ||
- | opinion.setTexto(texto); | ||
- | opinion.setFecha(new Date(System.currentTimeMillis())); | ||
- | opinion.setPuntuacion(puntuacion); | ||
- | |||
- | repository.save(opinion); | ||
- | } | ||
- | } | ||
- | </ | ||
- | |||
- | ==== Ejecución del servidor ==== | ||
- | |||
- | Una vez terminado todo, para lanzar el servidor tenemos dos opciones: | ||
- | * Desde el propio IDE, ejecutando '' | ||
- | * Utilizando el jar que podemos generar con el comando '' | ||
- | |||
- | {{ youtube> | ||
- | |||
- | ==== Depuración de Servicios Web ==== | ||
- | |||
- | La primera aproximación a la hora de depurar los Servicios Web desarrollados es utilizar el navegador introduciendo las URLs esperando obtener la salida apropiada y comprobar asi que todo funciona correctamente. Es bastante cómodo pero fácil de usar y eficiente, hasta un punto. | ||
- | |||
- | Si lo que queremos es depurar totalmente, y de una forma profesional, | ||
- | |||
- | < | ||
- | {{ postman.png }} | ||
- | < |
apuntes/serviciosweb.1594980961.txt.gz · Last modified: 17/07/2020 10:16 by Santiago Faci