web-dev-qa-db-fra.com

Envoi SOAP demande utilisant Python Requêtes

Est-il possible d'utiliser la bibliothèque requests de Python pour envoyer une requête SOAP?

60
Deepankar Bajpeyi

C'est effectivement possible.

Voici un exemple appelant le service Météo SOAP avec des requêtes simples, 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

Quelques notes:

  • Les en-têtes sont importants. La plupart des requêtes SOAP) ne fonctionneront pas sans les en-têtes appropriés. application/soap+xml est probablement le plus correct en-tête à utiliser (mais le service météorologique préfère text/xml
  • Cela renverra la réponse sous forme de chaîne xml - vous devrez alors analyser ce fichier xml.
  • Pour plus de simplicité, j'ai inclus la demande sous forme de texte brut. Mais la meilleure pratique serait de stocker ceci en tant que modèle, vous pourrez alors le charger en utilisant jinja2 (par exemple) - et également passer des variables.

Par exemple:

from jinja2 import Environment, PackageLoader
env = Environment(loader=PackageLoader('myapp', 'templates'))
template = env.get_template('soaprequests/WeatherSericeRequest.xml')
body = template.render()

Certaines personnes ont mentionné la bibliothèque de mousse. Suds est probablement le plus correct moyen d’interagir avec SOAP, mais je trouve souvent que cela panique un peu lorsque vous avez des WDSL mal formés (qui, TBH, est plus probable qu’improbable quand vous traitez avec une institution qui utilise toujours SOAP;)).

Vous pouvez faire ce qui précède avec de la mousse comme ceci:

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 

Remarque: Lorsque vous utilisez de la mousse, vous finirez presque toujours par avoir besoin de consultez votre médecin !

Enfin, un petit bonus pour le débogage de SOAP; TCPdump est votre ami. Sur Mac, vous pouvez exécuter TCPdump comme ceci:

Sudo tcpdump -As 0 

Cela peut être utile pour inspecter les demandes qui passent réellement par le fil.

Les deux extraits de code ci-dessus sont également disponibles sous forme de résumé:

121
toast38coza