6 feb. 2012

WebService con Soappy

Hace ya mucho tiempo escribí un ejemplo de como usar xml-rpc desde python como webservice.
En este caso se explicará el uso de otro protocolo que deriva de xml-rpc que se llama SOAP (Simple Object Access Protocol).

SOAP es un protocolo estándar que define cómo dos objetos en diferentes procesos pueden comunicarse por medio del intercambio de datos XML. Pueden conseguir más información en la página de wikipedia.


En python existe un módulo para trabajar con SOAP que se llama soappy. Lo primero que se hará es instalarlo.

#apt-get install python-soappy

La idea es crear 4 funciones, de suma, resta, multiplicación y división, registrarlas en el servicio SOAP, levantar el servidor y realizar las llamadas desde el cliente.

El programa servidor de SOAP es el siguiente:


#!/usr/bin/env python

import SOAPpy

#Funciones que devuelven la suma, resta, multiplicacion y division de 2 numeros

def suma(a,b):
    return a+b

def resta(a,b):
    return a-b

def multiplicacion(a,b):
    return a*b

def division(a,b):
    return a/b

#Se crea la instancia del servicio SOAP en el equipo por el puerto 8080.
server = SOAPpy.SOAPServer(("localhost", 8080))

#Registro de las funciones suma,resta, multiplicacion y division
#en el servicio SOAP.
server.registerFunction(suma)
server.registerFunction(resta)
server.registerFunction(multiplicacion)
server.registerFunction(division)

#Levantar el servicio SOAP.
server.serve_forever()

El programa cliente de SOAP es el siguiente:
#!/usr/bin/env python

#Se importa el modulo SOAPpy
import SOAPpy

#Se crea la instancia del proxy SOAP
#a el servidor SOAP
server = SOAPpy.SOAPProxy("http://localhost:8080/")

#Se llama las funciones registradas en el servidor SOAP
print "El resultado de la suma es: ", server.suma(5,10)
print "El resultado de la resta es: ",server.resta(20,5)
print "El resultado de la multiplicacion es: ", server.multiplicacion(10,5)
print "El resultado de la division es: ", server.division(10,3)

Se le da permisos de ejecución a ambos archivos, se ejecuta primero el servidor y luego el cliente que devuelve el siguiente resultado:

Se ejecuta cada programa en una consola distinta.
ecrespo@jewel:~/bin$ ./soapservidor.py

ecrespo@jewel:~/bin$ ./soapcliente.py
El resultado de la suma es:  15
El resultado de la resta es:  15
El resultado de la multiplicacion es:  50
El resultado de la division es:  3


5 comentarios:

ermigoo dijo...

esta excelente de pana me gusta, felicitaciones. pero el servidor como lo pudiera alojar en mi hosting normal tendria q tener python en mi hosting.
Y que posibilidades tengo de hacer un web service asi con python. gracias mi correo es davidrodriguez24 en gmail

emilio dijo...

Muchas gracias por la entrada. Estoy investigando el tema de los web services con pythony me ha sido muy útil.
Después del ejemplo citado estoy intentando usar el servicio desde otro equipo, pero la cosa no funciona: el código es algo como sustituir localhost por la ip de la máquina:

server = SOAPpy.SOAPProxy("http://191.141.211.11:8080")

Pero me da el error:
socket.error: [Errno 113] No route to host

He hecho todas las comprobaciones que se me ocurren sobre el servidor (puerto 8080 abierto, servicio corriendo, puedo hacer ping e incluso ssh desde la máquina cliente) pero no veo manera de pasar de aquí. ¿Alguna idea para seguir adelante?
Saludos

Ernesto Crespo dijo...

Para este fin espero publicar una versión del script de servidor y el cliente con el manejo automático de la IP del equipo. Espero sacar esa idea y que funcione.

Ernesto Crespo dijo...

En este enlace tienes la versión que probe entre distintos equipos.

Servidor:
http://www.crespo.org.ve/varios/soapserver.py

Cliente:
http://www.crespo.org.ve/varios/soapcliente.py

Fernando Montilla dijo...

Hola, Ernesto felicitaciones por tu Blog. Sabes que estoy tratando de bajarme los codigos que publicastes porteriormente:
Servidor:
http://www.crespo.org.ve/varios/soapserver.py

Cliente:
http://www.crespo.org.ve/varios/soapcliente.py


y me sale 404 - Not Found :(