2013-08-11 16 views

Odpowiedz

74

Jest to rzeczywiście możliwe.

Oto przykład wywołanie Pogoda SOAP usługi przy użyciu zwykłego wnioski lib:

import requests 
url="http://wsf.cdyne.com/WeatherWS/Weather.asmx?WSDL" 
#headers = {'content-type': 'application/soap+xml'} 
headers = {'content-type': 'text/xml'} 
body = """<?xml version="1.0" encoding="UTF-8"?> 
     <SOAP-ENV:Envelope xmlns:ns0="http://ws.cdyne.com/WeatherWS/" xmlns:ns1="http://schemas.xmlsoap.org/soap/envelope/" 
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"> 
      <SOAP-ENV:Header/> 
       <ns1:Body><ns0:GetWeatherInformation/></ns1:Body> 
     </SOAP-ENV:Envelope>""" 

response = requests.post(url,data=body,headers=headers) 
print response.content 

Kilka uwag:

  • Nagłówki są ważne. Większość żądań SOAP nie działa bez poprawnych nagłówków. application/soap+xml jest chyba bardziej poprawne nagłówek użyć (ale weatherservice preferuje text/xml
  • To zwróci odpowiedź jako ciąg xml. - byś wtedy trzeba przeanalizować ten xml
  • Dla uproszczenia mam włączone żądanie jako zwykły tekst. Ale najlepsze praktyki byłoby zapisać to jako szablon, można ładować go przy użyciu jinja2 (na przykład) - a także przekazać w zmiennych

na przykład:

.

Niektóre osoby wspomniały o bibliotece mydlin. Suds jest prawdopodobnie bardziej podatny na interakcję z SOAP, ale często stwierdzam, że trochę panikuje, gdy masz źle sformułowane WDSL (które, TBH, jest bardziej prawdopodobne niż kiedy masz do czynienia z instytucją wciąż używa SOAP;)).

Można zrobić powyższe z mydlin tak:

from suds.client import Client 
url="http://wsf.cdyne.com/WeatherWS/Weather.asmx?WSDL" 
client = Client(url) 
print client ## shows the details of this service 

result = client.service.GetWeatherInformation() 
print result 

Uwaga: przy użyciu mydlin, będzie prawie zawsze kończy się konieczności use the doctor!

Wreszcie mała premia za debugowanie SOAP; TCPdump jest twoim przyjacielem. Na komputerze Mac, można uruchomić tcpdump tak:

sudo tcpdump -As 0 

Może to być pomocne do kontroli wniosków, które rzeczywiście iść na drucie.

Powyższe dwa fragmenty kodu są również dostępne jako GIST:

+1

co się stanie, jeśli usługa zażąda nazwy użytkownika i hasła? gdzie je notować? – Oskars

+0

Fragment kodu suds daje teraz "suds.transport.TransportError: HTTP Error 500: Internal Server Error". Wygląda na to, że serwer jest zamknięty. – Louis

+0

@ toast38coza http://wsf.cdyne.com/WeatherWS/Weather.asmx?WSDL -> Błąd serwera w aplikacji "/ WeatherWS". Zaktualizuj przykład. –

Powiązane problemy