Pythonの requests
ライブラリを使用してSOAPリクエストを送信することは可能ですか?
それは確かに可能です。
プレーンリクエストライブラリを使用して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
注意事項:
application/soap+xml
は、おそらくより多くのcorrectヘッダーです(しかし、weatherserviceはtext/xml
を好みます)例:
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つのコードスニペットは、要点としても利用可能です: