User Tools

Site Tools


apuntes:servicios_web

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
Last revisionBoth sides next revision
apuntes:servicios_web [2018/02/07 00:03] – [Configuración del servidor] Santiago Faciapuntes:servicios_web [2019/01/04 13:22] – external edit 127.0.0.1
Line 116: Line 116:
  
 jar { jar {
-  baseName = 'eventoserver'+  baseName = 'opiniones'
   version = '0.0.1'   version = '0.0.1'
 } }
Line 197: Line 197:
  
 <code java> <code java>
 +import javax.persistence.*;
 /** /**
  * Opinion que los usuarios tienen sobre un monumento  * Opinion que los usuarios tienen sobre un monumento
Line 226: Line 227:
 } }
 </code> </code>
 +
 +> **Recordad que todas las anotaciones Java en el ejemplo anterior son clases que pertenecen al paquete 'javax.persistence'. Tened cuidado de no importar las mismas clases que existen en otros paquetes, aunque estén relacionados con Spring**
  
 ==== El Acceso a la Base de Datos ==== ==== El Acceso a la Base de Datos ====
Line 260: Line 263:
 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://localhost:8082/opiniones_puntuacion?puntuacion=4 (cambiando ''localhost'' por la IP o nombre del servidor que corresponda en cada caso). Más adelante se verá cómo hacerlo desde una aplicación Android pero es posible probar nuestro servidor accediendo a estas URLs directamente desde el navegador, de forma que podamos comprobar que todo funciona correctamente antes de seguir. 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://localhost:8082/opiniones_puntuacion?puntuacion=4 (cambiando ''localhost'' por la IP o nombre del servidor que corresponda en cada caso). Más adelante se verá cómo hacerlo desde una aplicación Android pero es posible probar nuestro servidor accediendo a estas URLs directamente desde el navegador, de forma que podamos comprobar que todo funciona correctamente antes de seguir.
  
-  * http://localhost:8082/opiniones_puntuacion +  * http://localhost:8080/opiniones 
-  * http://localhost:8082/opiniones_puntuacion?puntuacion=4 +  * http://localhost:8080/opiniones_puntuacion 
-  * http://localhost:8082/add_opinion?titulo=eltitulo&texto=eltexto&puntuacion=10+  * http://localhost:8080/opiniones_puntuacion?puntuacion=4 
 +  * http://localhost:8080/add_opinion?titulo=eltitulo&texto=eltexto&puntuacion=10
  
 <code java> <code java>
Line 330: Line 334:
  
 {{ youtube>TBIzVT5dHC4 }} \\ {{ youtube>TBIzVT5dHC4 }} \\
 +
 +==== 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, nuestros Servicios Web, tenemos que usar aplicaciones destinadas para ese propósito, como [[https://www.getpostman.com|Postman]], que es una aplicación destinada exclusivamente a testear APIs.
 +
 +<figure>
 +{{ postman.png }}
 +<caption>Postman</caption></figure>
 +===== Consumir un servicio web desde Django =====
 +
 +Puesto que la idea es consumir un servicio web que nos ofrecerá una serie de datos en formato JSON y nos interesaría convertirlos fácilmente a objetos Python, instalaremos el paquete //djangorestframework// que nos permitirá utilizar los objetos //Serializer// que realizarán esta tarea por nosotros.
 +
 +<code bash>
 +santi@zenbook:$ pip3 install djangorestframework requests
 +</code>
 +
 +Una vez instalado el paquete tendremos que añadirlo al fichero ''settings.py'' de nuestro proyecto:
 +
 +<file python settings.py>
 +. . .
 +INSTALLED_APPS = [
 +    . . .
 +    'rest_framework'
 +]
 +. . .
 +</file>
 +
 +En nuestro caso vamos a concectar con un servicio web que ofrece datos sobre opiniones de usuarios de forma que obtenemos, entre otros, un titulo, un texto y una puntuación. Entonces crearemos un modelo de datos ''Opinion'' para almacenar dicha información en forma de objeto (suponemos, para este ejemplo, que guardamos en las opiniones el título de la pelicula de dicha opinion, por lo que en el servicio web que hicieramos también deberíamos añadirlo. En el ejemplo de clase no aparece).
 +
 +<file python models.py>
 +. . .
 +class Opinion(models.Model):
 +    titulo = models.CharField(max_length=200)
 +    texto = models.CharField(max_length=200)
 +    puntuacion = models.IntegerField
 +    pelicula = models.CharField(max_length=200)
 +. . .
 +</file>
 +
 +Ahora, en un fichero que llamaremos ''serializer.py'' (tendremos que añadirlo a la misma altura que ficheros como ''views.py'' o ''models.py''), añadiremos la información para que éste serialize la información en JSON al modelo definido anteriormente.
 +
 +<file python serializer.py>
 +from rest_framework import serializers
 +from .models import Opinion
 +
 +
 +class OpinionSerializer(serializers.ModelSerializer):
 +    class Meta:
 +        fields = ('titulo', 'texto', 'puntuacion', 'pelicula')
 +        model = Opinion
 +</file>
 +
 +Desde Django podríamos acceder al servicio web para listar todas las opiniones:
 +
 +<file python views.py>
 +import requests
 +. . .
 +def opiniones(request):
 +    ws = requests.get('http://localhost:8080/opiniones')
 +    json = ws.json()
 +    serializer = OpinionSerializer(data=json, many=True)
 +    if serializer.is_valid():
 +        lista_opiniones = serializer.save()
 +        context = {'lista_opiniones': lista_opiniones}
 +        return render(request, 'peliculas/opiniones.html', context)
 +    else:
 +        print(serializer.errors)
 +
 +    return render(request, 'peliculas/index.html')
 +. . .
 +</file>
 +
 +O bien acceder a las opiniones para una pelicula determinada, pasando como parámetro el nombre de la película (en este caso):
 +
 +<file python views.py>
 +import requests
 +. . .
 +def pelicula(request, pelicula_id):
 +    pelicula = Pelicula.objects.get(pk=pelicula_id)
 +    . . .
 +    ws = requests.get('http://localhost:8080/opiniones?pelicula=' + pelicula.titulo)
 +    json = ws.json()
 +    serializer = OpinionSerializer(data=json, many=True)
 +    if serializer.is_valid():
 +        lista_opiniones = serializer.save()
 +        context = {'lista_opiniones': lista_opiniones, 'pelicula': pelicula}
 +        return render(request, 'peliculas/index.html', context)
 +    else:
 +        print(serializer.errors)
 +
 +    return render(request, 'peliculas/index.html')
 +. . .
 +</file>
 +
 +En el caso de que no queramos guardarlo en la Base de Datos, podemos simplemente obtener los datos como una lista de 'OrderedDict' para visualizarlos:
 +
 +<code python>
 +. . .
 +    if serializer.is_valid():
 +        lista_opiniones = serializer.data
 +        // Visualiza el titulo de la primera opinion obtenida
 +        print(lista_opiniones[0]['titulo'])
 +. . .
 +</code>
 +
 +===== Seguridad en Servicios Web =====
  
 ---- ----
Line 344: Line 456:
     - Información de un evento concreto a partir del nombre del mismo     - Información de un evento concreto a partir del nombre del mismo
   - Amplia el ejercicio anterior para que sea posible registrar y eliminar eventos   - Amplia el ejercicio anterior para que sea posible registrar y eliminar eventos
 +  - Diseña una web con Django que muestre los resultados de los partidos de fútbol utilizando como origen de datos el servicio web desarrollado en el primer ejercicio
 +  - Incorpora a la web realizada en el punto anterior un buscador por equipos de futbol (local o visitante)
  
 ---- ----
Line 355: Line 469:
 ---- ----
  
-(c) 2017 Santiago Faci+(c) 2018 Santiago Faci
apuntes/servicios_web.txt · Last modified: 2021/10/21 06:56 by Santiago Faci