Servicios Web en Python – Parte 2

En el capítulo anterior de esta serie, hice una introducción a los servicios Web y expliqué brevemente las implementaciones usando XML-RPC y SUDS.

En este capítulo iniciaré la descripción de la librería SOAPpy, mostrando un caso de instalación en Windows y Linux, además de incluir códigos de ejemplo para un cliente y servidor.

SOAPpy

Es una librería que trabaja en SOAP, tanto como cliente o como servidor:

Permite crear de forma simple, tanto clientes como servidores SOAP. Para acceder a diversos ejemplos, se recomienda ir a: https://github.com/kiorky/SOAPpy/tree/develop/docs

Instalación de Librerías

Para usar SOAPpy, primero debemos instalar la librería. Pero antes se deben instalar otras librerías:

  • “fpconst”.- Manejo de formato en coma flotante IEEE754.
  • “setuptools”.- Utilidades para instalación.
  • “docutils”.- utilidades para manejo formatos como html, xml.
  • “wstools”.- Servicios para tratamiento del archivo WDSL.

Para verificar si está instalada “fpconst”, hacemos:

>>> import fpconst
>>> fpconst.__version__
'0.7.2'

Para verificar si está instalada “setuptools”, hacemos:

>>> import setuptools
>>> setuptools.__version__
'1.1.4'

Para verificar si está instalada “wstools”, hacemos:

>>> import wstools

Y para “SOAPpy” hacemos:

>>> import SOAPpy
>>> SOAPpy.__version__
'0.12.5'

Si nos responden con el número de versión, significará que tenemos las librerías correctamente instaladas.

Instalación en Windows

Como se requieren varias librerías, es preferible instalar primero la librería «Setup Tools»: https://pypi.python.org/pypi/setuptools/1.1.1

«Setup Tools», permite instalar fácilmente diversas librerías en Python. Para ello, accede a la red para bajar los instaladores. Funciona tanto en Windows como en Linux.

Para instalar esta librería en Windows es recomendable bajarse el programa: https://bitbucket.org/pypa/setuptools/raw/bootstrap/ez_setup.py

Ejecutarlo desde Windows o por línea de comando:

c:\> python ez_setup.py

Una vez instalado, tendremos varias herramientas útiles para poder hacer otras instalaciones de forma sencilla. Al instalarse “SetupTools”, creará la carpeta «C:\Python27\Scripts», con los siguientes archivos:

  • easy_install.exe
  • easy_install-2.7.exe
  • easy_install-script.py
  • easy_install-2.7-script.py

Estos archivos son las utilidades de instalación que necesitamos. Los ejecutables “easy_install.exe”, y “easy_install-2.7.exe” son dos versiones de “easy_install”, que es el programa que se usa para la instalación de librerías:

Así, por ejemplo, para instalar la librería “suds”, haremos: 

C:\Python27\Scripts>easy_install-2.7.exe suds

Nosotros usamos “easy_install-2.7.exe”, porque estamos usando la versión 2.7 de Python.

Para instalar fpconst;

C:\Python27\Scripts>easy_install-2.7.exe fpconst

Para instalar SOAPpy;

C:\Python27\Scripts>easy_install-2.7.exe SOAPpy

Esta es la forma más sencilla de realizar las instalaciones, porque   “easy_install“, se encargará de verificar las dependencias de otras librerías antes de instalar cualquier librería. Por ejemplo para SOAPpy, “easy_install”, primero instala otras librerías, conectándose a internet para obtener los instaladores.

Una vez instalada cualquier librería nueva hay que cerrar y abrir nuevamente el Python, para apreciar los cambios.

Si “easy_install” no puede instalar las librerías requeridas, hay que realizar un proceso de instalación manual.

Instalación en Linux

Para este caso trabajaremos con la Python 2.6.6.

También es posible usar “SetupTools” en Linux para facilitar la instalación. Pero aquí mostraremos la instalación usando los paquetes de instalación, sin necesidad de conexión a internet (que es lo que requiere “easy_install”). Para ello necesitaremos agenciarnos de las librerías y transferirlas al servidor Linux donde deseemos trabajar.

===LIBERÍA fpconst

Para instalar fpconst, descargar “fpconst-0.7.2.tar.gz” y poner en el servidor en una ubicación en donde el usuario tenga privilegios.

Descomprimir con gunzip y con tar:

# gunzip fpconst-0.7.2.tar.gz
# tar xvf fpconst-0.7.2.tar
# cd fpconst-0.7.2

Esto creará un directorio “/fpconst-0.7.2”, con los archivos de la librería.

Para instalar, ejecutar:

# python setup.py install

Puede ser necesario, tener privilegios de administrador, para la instalación.

=== LIBERÍA setuptools

Para instalar setuptools, descargar “setuptools-1.1.4.tar.gz” y poner en el servidor en una ubicación en donde el usuario tenga privilegios.

Descomprimir con gunzip y con tar:

# gunzip setuptools-1.1.4.tar.gz
# tar xvf setuptools-1.1.4.tar
# cd setuptools-1.1.4

Esto creará un directorio “/setuptools-1.1.4”, con los archivos de la librería.

Para instalar, ejecutar:

# python setup.py install --user

=== LIBERÍA docutils

Para instalar docutils, descargar “docutils-0.11.tar.gz” y poner en el servidor en una ubicación en donde el usuario tenga privilegios.

Descomprimir con gunzip y con tar:

# gunzip docutils-0.11.tar.gz
# tar xvf docutils-0.11.tar
# cd docutils-0.11

Esto creará un directorio “/docutils-0.11”, con los archivos de la librería.

Para instalar, ejecutar:

# python setup.py install

Puede ser necesario, tener privilegios de administrador, para la instalación.

=== LIBERÍA wstools

Para instalar «wstools», descargar “wstools-0.4.3.tar.gz” y poner en el servidor en una ubicación en donde el usuario tenga privilegios.

Descomprimir con gunzip y con tar:

# gunzip wstools-0.4.3.tar.gz
# tar xvf wstools-0.4.3.tar
# cd wstools-0.4.3

Esto creará un directorio “/wstools-0.4.3”, con los archivos de la librería.

Para instalar, ejecutar:

# python setup.py install

=== LIBERÍA SOAPpy

 Para instalar SOAPpy, descargar “SOAPpy-0.12.5.tar.gz” y poner en el servidor en una ubicación en donde el usuario tenga privilegios.

 Descomprimir con gunzip y con tar:

# gunzip SOAPpy-0.12.5.tar.gz
# tar xvf SOAPpy-0.12.5.tar
# cd SOAPpy-0.12.5

Esto creará un directorio “/SOAPpy-0.12.5”, con los archivos de la librería.

Para instalar, ejecutar:

# python setup.py build
# python setup.py install

Puede ser necesario, tener privilegios de administrador, para la instalación.

Cliente sencillo

Con SOAPpy, es bastante fácil crear un cliente (consumidor de Web Service) que se comunique con un Web Service disponible en la Web para obtener alguna información que nos pueda proporcionar.

Para este ejemplo usaremos la web «footballpool.dataaccess.eu»:

#################  CLIENTE ##################
import SOAPpy
service_url = 'http://footballpool.dataaccess.eu/data/info.wso'
namespace = 'http://footballpool.dataaccess.eu'
client = SOAPpy.SOAPProxy(service_url, namespace)
client.Cities()

Ejecutar línea por línea en el Shell. El resultado debe ser:

<soappy.types.structtype 25207512="" at="" citiesresult="">: {'string': ['Cape Town', 'Durban', 'Johannesburg', 'Mangaung/Bloemfontein', 'Nelspruit', 'Polokwane', 'Port Elisabeth', 'Rustenburg', 'Tswane/Pretoria']} </soappy.types.structtype>

Está demás decir (pero lo voy a decir) que para que este ejemplo funcione, es necesario que la PC donde se ejecute, tenga conexión a Internet.

Cliente y Servidor con SOAPpy

La librería SOAPpy permite implementar un proveedor de Web Service de modo Stand-Alone, es decir, sin necesidad de tener un Servidor Web instalado, como el apache. Para este ejemplo usaremos nuestra msima PC como un servidor de Web Service, usando el puerto 8080:

#################  SERVIDOR ##################
import SOAPpy

def saludo():
  return "Hola Mundo"

server = SOAPpy.SOAPServer(("localhost", 8080))
server.registerFunction(saludo)
server.serve_forever()

Notar que el parámetro que se le pasa a SOAPServer, es una tupla («localhost», 8080).

El método “registerFunction()” es el que permite exponer una función a la red. La función a exponer, debe haber sido previamente creada.

El método “serve_forever()” mantiene el servicio Web activo por tiempo indefinido.

Una forma de probar si el servicio Web está activo puede ser usando un navegador común y escribir la dirección: http://localhost:8080 Si todo anda bien, se debe obtener una respuesta de tipo:

Error response

Error code 501.

Message: Unsupported method (‘GET’).

Error code explanation: 501 = Server does not support this operation.

Que nos indica que hay respuesta de nuestra PC en el puerto 8080, y que se le ha pedido una solicitud de GET pero no se soporta.

Para hacer un cliente sencillo que permita ejecutar la función “saludo”, necesitamos el siguiente código:

#################  CLIENTE ##################
import SOAPpy
server = SOAPpy.SOAPProxy("http://localhost:8080/")
print server.saludo()

La respuesta debe ser:

Hola mundo

El método a llamar, se llama como si fuera un método de “server”. El nombre debe coincidir exactamente con el nombre original del método. No debe haber diferencia en el tipo de caja. Si por ejemplo usáramos “server.Saludo()”, se generaría un error.

Otro ejemplo un poco más elaborado, el que mostramos, incluye un parámetro y muestra un mensaje cuando se atiende un requerimiento:

#################  SERVIDOR ##################
import SOAPpy

#función que retorna el doble
def doble(x):
    print "petic. atendida"
    return 2*x

server = SOAPpy.SOAPServer(("localhost", 8080))
server.registerFunction(doble)
print "Esperando peticiones"
server.serve_forever()

#################  CLIENTE ##################
import SOAPpy
server = SOAPpy.SOAPProxy("http://localhost:8080")
print server.doble(5)

Si se llama a la función equivocada, se generará un error por el lado del cliente. Pero si se llama a la función con error en la cantidad de parámetros se generará un error por el lado del cliente y servidor. El servidor mostrará la excepción pero seguirá corriendo.

Es posible ejecutar una llamada a la función remota, usando el nombre del parámetro, en la llamada:

#################  CLIENTE ##################
import SOAPpy
server = SOAPpy.SOAPProxy("http://localhost:8080")
print server.doble(x = 5)

El nombre indicado del parámetro (x) debe ser igual al nombre usado en el servidor, de otra forma se generará un error.


Sé el primero en comentar

Dejar una contestacion

Tu dirección de correo electrónico no será publicada.


*