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/15 15:20] – [Consumir un servicio web desde Django] Santiago Faciapuntes:servicios_web [2019/01/04 13:22] – external edit 127.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 332: Line 335:
 {{ 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 ===== ===== 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> <code bash>
-santi@zenbook:$ pip3 install djangorestframework+santi@zenbook:$ pip3 install djangorestframework requests
 </code> </code>
 +
 +Una vez instalado el paquete tendremos que añadirlo al fichero ''settings.py'' de nuestro proyecto:
  
 <file python settings.py> <file python settings.py>
Line 346: Line 362:
 . . . . . .
 </file> </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> <file python models.py>
Line 353: Line 371:
     texto = models.CharField(max_length=200)     texto = models.CharField(max_length=200)
     puntuacion = models.IntegerField     puntuacion = models.IntegerField
 +    pelicula = models.CharField(max_length=200)
 . . . . . .
 </file> </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> <file python serializer.py>
Line 363: Line 384:
 class OpinionSerializer(serializers.ModelSerializer): class OpinionSerializer(serializers.ModelSerializer):
     class Meta:     class Meta:
-        fields = ('titulo', 'texto', 'puntuacion')+        fields = ('titulo', 'texto', 'puntuacion', 'pelicula')
         model = Opinion         model = Opinion
 </file> </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> <file python views.py>
 +import requests
 . . . . . .
 def pelicula(request, pelicula_id): def pelicula(request, pelicula_id):
Line 386: Line 430:
 </file> </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 400: 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)
  
 ---- ----
apuntes/servicios_web.txt · Last modified: 2021/10/21 06:56 by Santiago Faci