Capítulo 12. Servicios web SOAP

Capítulo 11 se centró en los servicios web sobre HTTP orientados a documentos. El “parámetro de entrada” era la URL y el “valor devuelto” era un documento XML que debíamos responsabilizarnos de interpretar.

Este capítulo se centrará en los servicios web SOAP, que tienen un enfoque más estructurado. En lugar de trabajar directamente con consultas HTTP y documentos XML SOAP nos permite simular llamadas a función que devuelven tipos de datos nativos. Como veremos, la ilusión es casi perfecta; podemos “invocar” una función mediante una biblioteca de SOAP, con la sintaxis estándar de Python, y resulta que la función devuelve valores y objetos de Python. Sin embargo, bajo esa apariencia la biblioteca de SOAP ha ejecutado en realidad una transacción compleja que implica varios documentos XML y un servidor remoto.

SOAP es una especificación compleja y es un poco inexacto decir que SOAP se trata de llamadas a funciones remotas. Algunas personas añadirían que SOAP permite realizar paso asíncrono de mensajes en un solo sentido y servicios web orientados al documento. Y estarían en lo correcto; SOAP se puede usar de esa manera y de muchas maneras diferentes. Pero este capítulo se centrará en el también llamado SOAPal estilo RPC” (llamar a una función remota y obtener sus resultados).

12.1. Inmersión

Usted usa Google, ¿verdad? Es un motor de búsquedas popular. ¿Ha deseado alguna vez poder acceder a los resultados de búsquedas de Google de forma programática? Ahora puede. Aquí tiene un programa que busca en Google desde Python.

Ejemplo 12.1. search.py

from SOAPpy import WSDL

# you'll need to configure these two values;
# see http://www.google.com/apis/
WSDLFILE = '/path/to/copy/of/GoogleSearch.wsdl'
APIKEY = 'YOUR_GOOGLE_API_KEY'

_server = WSDL.Proxy(WSDLFILE)
def search(q):
    """Search Google and return list of {title, link, description}"""
    results = _server.doGoogleSearch(
        APIKEY, q, 0, 10, False, "", False, "", "utf-8", "utf-8")
    return [{"title": r.title.encode("utf-8"),
             "link": r.URL.encode("utf-8"),
             "description": r.snippet.encode("utf-8")}
            for r in results.resultElements]

if __name__ == '__main__':
    import sys
    for r in search(sys.argv[1])[:5]:
        print r['title']
        print r['link']
        print r['description']
        print

Puede importar esto como módulo y usarlo desde otro programa mayor, o puede ejecutar el script desde la línea de órdenes. Desde la línea de órdenes puede indicar la consulta de búsqueda como argumento, y como resultado obtendrá la URL, título y descripción de los cinco primeros resultados de Google.

Aquí tiene la salida de ejemplo para una búsqueda de la palabra “python

Ejemplo 12.2. Ejemplo de uso de search.py

C:\diveintopython\common\py> python search.py "python"
<b>Python</b> Programming Language
http://www.python.org/
Home page for <b>Python</b>, an interpreted, interactive, object-oriented,
extensible<br> programming language. <b>...</b> <b>Python</b>
is OSI Certified Open Source: OSI Certified.

<b>Python</b> Documentation Index
http://www.python.org/doc/
 <b>...</b> New-style classes (aka descrintro). Regular expressions. Database
API. Email Us.<br> docs@<b>python</b>.org. (c) 2004. <b>Python</b>
Software Foundation. <b>Python</b> Documentation. <b>...</b>

Download <b>Python</b> Software
http://www.python.org/download/
Download Standard <b>Python</b> Software. <b>Python</b> 2.3.3 is the
current production<br> version of <b>Python</b>. <b>...</b>
<b>Python</b> is OSI Certified Open Source:

Pythonline
http://www.pythonline.com/


Dive Into <b>Python</b>
http://diveintopython.org/
Dive Into <b>Python</b>. <b>Python</b> from novice to pro. Find:
<b>...</b> It is also available in multiple<br> languages. Read
Dive Into <b>Python</b>. This book is still being written. <b>...</b>

Lecturas complementarias sobre SOAP