Zanurkuj w Pythonie/Debugowanie serwisu sieciowego SOAP

Debugowanie serwisu sieciowego SOAP edytuj

Biblioteki SOAP dostarczają łatwego sposobu na zobaczenie co się tak naprawdę dzieje za kulisami.

Włączenie debugowania to jest po prostu kwestia ustawienia dwóch flag w konfiguracji SOAPProxy.

Przykład 12.7. Debugowanie serwisów SOAP

 >>> from SOAPpy import SOAPProxy
 >>> url = 'http://services.xmethods.net:80/soap/servlet/rpcrouter'
 >>> n = 'urn:xmethods-Temperature'
 >>> server = SOAPProxy(url, namespace=n)     #(1)
 >>> server.config.dumpSOAPOut = 1            #(2)
 >>> server.config.dumpSOAPIn = 1
 >>> temperature = server.getTemp('27502')    #(3)
 *** Outgoing SOAP ******************************************************
 <?xml version="1.0" encoding="UTF-8"?>
 <SOAP-ENV:Envelope SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
   xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/"
   xmlns:xsi="http://www.w3.org/1999/XMLSchema-instance"
   xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
   xmlns:xsd="http://www.w3.org/1999/XMLSchema">
 <SOAP-ENV:Body>
 <ns1:getTemp xmlns:ns1="urn:xmethods-Temperature" SOAP-ENC:root="1">
 <v1 xsi:type="xsd:string">27502</v1>
 </ns1:getTemp>
 </SOAP-ENV:Body>
 </SOAP-ENV:Envelope>
 ************************************************************************
 *** Incoming SOAP ******************************************************
 <?xml version='1.0' encoding='UTF-8'?>
 <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xmlns:xsd="http://www.w3.org/2001/XMLSchema">
 <SOAP-ENV:Body>
 <ns1:getTempResponse xmlns:ns1="urn:xmethods-Temperature"
   SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
 <return xsi:type="xsd:float">80.0</return>
 </ns1:getTempResponse>
 
 </SOAP-ENV:Body>
 </SOAP-ENV:Envelope>
 ************************************************************************
 
 >>> temperature
 80.0
 
  1. Po pierwsze tworzymy normalnie SOAPProxy podając URL serwisu i przestrzeń nazw.
  2. Po drugie włączamy debugowanie poprzez ustawienie server.config.dumpSOAPIn i server.config.dumpSOAPOut.
  3. Po trzecie wywołujemy jak zwykle zdalną metodę SOAP. Biblioteka SOAP wyświetli zarówno wychodzący dokument XML żądania, jak i przychodzący dokument XML odpowiedzi. To jest cała ciężka praca jaką SOAPProxy wykonuje dla Ciebie. Przerażające, nieprawdaż? Rozbierzmy to na czynniki.

Większość dokumentu XML żądania, który jest wysyłany do serwera, to są elementy stałe. Zignoruj wszystkie te deklaracje przestrzeni nazw; one nie ulegają zmianie (lub są bardzo podobne) w trakcie wszystkich wywołań SOAP. Sercem "wywołania funkcji" jest ten fragment w elemencie <Body>:

<ns1:getTemp                                 #(1)
  xmlns:ns1="urn:xmethods-Temperature"       #(2)
  SOAP-ENC:root="1">
<v1 xsi:type="xsd:string">27502</v1>         #(3)
</ns1:getTemp>
  1. Nazwą elementu jest nazwa funkcji: getTemp. SOAPProxy używa getattr jako dyspozytora. Zamiast wywoływania poszczególnych metod lokalnych bazując na nazwie metody, używa on nazwy metody do skonstruowania dokumentu XML żądania.
  2. Element XML-a dotyczący funkcji zawarty jest w konkretnej przestrzeni nazw, która to zostaje podana podczas tworzenia instancji klasy SOAPProxy. Nie przejmuj się tym SOAP-ENC:root; to też jest stały element.
  3. Argumenty funkcji także zostały przekształcone na XML-a. SOAPProxy używając introspekcji analizuje każdy argument, aby okreslić jego typ (w tym wypadku jest to string). Typ argumentu trafia do atrybutu xsi:type, a zaraz za nim podana jest jego wartość.

Zwracany dokument XML jest równie prosty do zrozumienia, jeśli tylko wiesz co należy zignorować. Skup się na tym fragmencie wewnątrz elementu <Body>:

<ns1:getTempResponse                             #(1)
  xmlns:ns1="urn:xmethods-Temperature"           #(2)
  SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<return xsi:type="xsd:float">80.0</return>       #(3)
</ns1:getTempResponse>
  1. Serwer zawarł wartość zwracaną przez funkcję w elemencie <getTempResponse>. Zgodnie z konwencją ten element jest nazwą funkcji plus słowo Response. Ale tak naprawdę to może być prawie cokolwiek; ważną rzeczą jaką SOAPProxy rozpatruje nie jest nazwa elementu, ale przestrzeń nazw.
  2. Serwer zwraca odpowiedź w tej samej przestrzeni nazw, której użyliśmy w żądaniu, tej samej przestrzeni nazw, którą podaliśmy, gdy po raz pierwszy tworzyliśmy obiekt klasy SOAPProxy. Dalej w tym rozdziale zobaczymy co się stanie, jeśli zapomnimy podać przestrzeń nazw podczas tworzenia obiektu SOAPProxy.
  3. Zwracana wartość jest podana wraz z jej typem (czyli float). SOAPProxy korzysta z tego typu danych do utworzenia właściwego wbudowanego typu danych Pythona i zwraca go.