Przejdź do zawartości

Zanurkuj w Pythonie/SOAP

Z Wikibooks, biblioteki wolnych podręczników.

SOAP

[edytuj]

Rozdział 11 przybliżył temat serwisów sieciowych HTTP zorientowanych na dokumenty. "Wejściowym parametrem" był URL, a "zwracaną wartością" był konkretny dokument XML, który można było sparsować.

Ten rozdział przybliży serwis sieciowy SOAP, który jest bardziej strukturalnym podejściem do problemu. Zamiast zajmować się bezpośrednio żądaniami HTTP i dokumentami XML, SOAP pozwala nam symulować wywoływanie funkcji, które zwracają natywne typy danych. Jak zobaczymy, złudzenie to jest niemal perfekcyjne: "wywołujemy" funkcję za pomocą biblioteki SOAP korzystając ze standardowej, wywołującej składni Pythona a funkcja zdaje się zwracać obiekty i wartości Pythona. Jednak pod tą przykrywką, biblioteka SOAP w rzeczywistości wykonuje złożoną transakcję wymagającą wielu dokumentów XML i zdalnego serwera.

SOAP jest złożoną specyfikacją i powiedzenie, że SOAP służy wyłącznie do zdalnego wywoływania funkcji będzie trochę wprowadzało w błąd. Niektórzy mogliby stwierdzić, że SOAP pozwala na jednostronne, asynchroniczne przekazywanie komunikatów i zorientowane na dokumenty serwisy sieciowe. I Ci ludzie także mieliby rację; SOAP może być wykorzystywany w ten sposób, a także na wiele innych. Jednak ten rozdział przybliży tak zwany "styl RPC" (Remote Procedure Call), czyli wywoływanie zewnętrznych funkcji i otrzymywanie z nich wyników.

Nurkujemy

[edytuj]

Korzystasz z Google, prawda? Jest to popularna wyszukiwarka. Chciałeś kiedyś mieć programowy dostęp do wyników wyszukiwania za pomocą Google? Teraz możesz. Poniżej mamy program, który poszukuje w Google za pomocą Pythona.

Przykład 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

Możesz importować to jako moduł i wykorzystywać to w większych programach, a także możesz uruchomić ten skrypt z linii poleceń. W linii poleceń przekazujemy zapytanie szukania jako argument linii poleceń, a program wypisuje nam URL, tytuł i opis z pięciu pierwszych wyników wyszukiwania.

Tutaj mamy przykładowe wyjście, gdy wyszkujemy słowo "python".

Przykład 12.2. Przykładowe użycie 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>