1. ホーム
  2. python

[解決済み] Python Requestsを使ったSOAPリクエストの送信

2023-03-30 07:01:25

質問

Pythonの requests ライブラリを使って SOAP リクエストを送ることはできますか?

どのように解決するのですか?

確かに可能です。

plain requests lib を使って 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 は、おそらくより 正しい ヘッダを使うべきでしょう (しかし、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()

何人かの人がsudsライブラリについて言及しています。Suds はおそらく、より 正しい の方法ですが、私はしばしば、WDSLがうまく形成されていないときに少しパニックになることを発見します(これは、TBH、まだSOAPを使用している機関と取引しているときに、そうでない場合よりも可能性が高いです ;) ).

sudsで上記のようなことができます。

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つのコードスニペットは、gistとしても利用可能です。