web-dev-qa-db-ja.com

SOAPリクエストを使用したPythonリクエストの送信

Pythonの requests ライブラリを使用してSOAPリクエストを送信することは可能ですか?

60

それは確かに可能です。

プレーンリクエストライブラリを使用してWeather SOAP Serviceを呼び出す例を次に示します。

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

注意事項:

  • ヘッダーは重要です。ほとんどのSOAP要求は、正しいヘッダーがないと機能しません。 application/soap+xmlは、おそらくより多くのcorrectヘッダーです(しかし、weatherserviceはtext/xmlを好みます)
  • これにより、応答がXMLの文字列として返されます。そのXMLを解析する必要があります。
  • 簡単にするために、プレーンテキストとしてリクエストを含めました。しかし、ベストプラクティスはこれをテンプレートとして保存し、jinja2(たとえば)を使用してロードし、変数を渡すことです。

例:

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

一部の人々は、泡ライブラリについて言及しています。泡はおそらくSOAPと対話するためのより多くの正しい方法ですが、誤って形成されたWDSL(TBHがより可能性が高いSOAP;)をまだ使用している機関を扱っているときではありません。

次のような泡で上記を行うことができます:

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 

注:泡を使用する場合、ほとんど常に 医師を使用

最後に、SOAPのデバッグには少しボーナスがあります。 TCPdumpはあなたの友達です。 Macでは、次のようにTCPdumpを実行できます。

Sudo tcpdump -As 0 

これは、実際にネットワークを経由するリクエストを検査するのに役立ちます。

上記の2つのコードスニペットは、要点としても利用可能です:

121
toast38coza