近年、Web APIの主流はRESTに移り変わりつつありますが、特にエンタープライズシステムや金融・医療分野など、依然としてSOAP(Simple Object Access Protocol)が重要な役割を果たしている場面は少なくありません。PythonでSOAPベースのWebサービスと連携する必要が出てきた場合、zeep
ライブラリは非常に強力な選択肢となります。
このブログ記事では、PythonのモダンなSOAPクライアントライブラリであるzeep
について、その概要からインストール、基本的な使い方、そして応用的な機能まで、網羅的に解説していきます。zeep
を使えば、複雑なSOAP通信もPythonicに、そして効率的に実装できるようになります。💪
1. SOAPとWSDLの基本
zeep
を理解する前に、SOAPとWSDLについて簡単に触れておきましょう。
SOAPとは?
SOAPは、XMLベースのメッセージングプロトコルで、主にネットワーク上のコンピュータ間で構造化された情報を交換するために使用されます。特に、Webサービスにおけるリモートプロシージャコール(RPC)の実装によく用いられます。HTTPやSMTPなどの様々なプロトコル上で動作させることができます。
WSDLとは?
WSDL (Web Services Description Language) は、Webサービスを記述するためのXMLベースの言語です。サービスが提供する操作(メソッド)、各操作が受け付けるメッセージ(パラメータ)、データ型、そしてサービスへのアクセス方法(エンドポイントURLや使用するプロトコル)などを定義します。クライアントはWSDLファイルを読むことで、そのWebサービスをどのように利用すればよいかを理解できます。
zeep
は、このWSDLファイルを解釈し、Pythonのコードからサービスを簡単に呼び出せるようにインターフェースを自動生成してくれる点が大きな特徴です。
2. なぜZeepなのか? ✨
PythonにはいくつかのSOAPクライアントライブラリが存在しますが、zeep
はその中でも特に推奨されることが多いライブラリです。その理由をいくつか挙げてみましょう。
- モダンで活発な開発:
zeep
は現在も活発に開発・メンテナンスされており、最新のPythonバージョン(Python 3.7以上、PyPy3もサポート)に対応しています。 - lxmlとrequestsベース: 高パフォーマンスなXMLパーサーである
lxml
と、デファクトスタンダードなHTTPライブラリであるrequests
(非同期処理にはhttpx
もサポート)を基盤としており、高速かつ安定した動作が期待できます。特に大きなSOAPレスポンスを扱う際にlxml
の恩恵を受けられます。 - 簡単なAPI: WSDLを自動的に解釈し、Pythonのメソッド呼び出しのように直感的にSOAPサービスを利用できるAPIを提供します。XMLの構造を直接意識する必要が少ないため、開発効率が向上します。
- 豊富な機能: SOAP 1.1, SOAP 1.2, HTTP GET/POST bindingに対応。WS-AddressingヘッダーやWS-Security (UsernameToken, X.509署名) など、エンタープライズ用途で必要となる機能もサポートしています。
- 優れた柔軟性: Transport層のカスタマイズ(タイムアウト設定、プロキシ利用、HTTP認証、セッション管理など)やプラグイン機構による機能拡張が容易です。
一方で、SOAP仕様自体が曖昧な部分も多く、世の中には不正なWSDLやバグを含むSOAPサーバーも存在します。zeep
は互換性を高める努力をしていますが、問題に遭遇した場合は、公式ドキュメントを参照したり、Issueを報告したりすることが推奨されます。
3. インストール 💻
zeep
のインストールはpip
を使って簡単に行えます。
pip install zeep
zeep
自体は純粋なPythonモジュールですが、依存ライブラリであるlxml
はC言語のコードを含んでいます(libxml2とlibxsltを利用)。
- Linux/BSD系:
libxml2-dev
とlibxslt-dev
(または相当するパッケージ) を事前にインストールしておく必要があります。 - Windows: wheelファイル(コンパイル済みバイナリを含む)を利用するのが最も簡単です。最新の
pip
があれば通常は自動で適切なwheelが選択されます。もしwheelが見つからない場合は、lxmlの公式ドキュメントなどを参考に手動でインストールが必要になる場合があります。
インストールが成功したか確認するには、Pythonインタプリタやスクリプトでimport zeep
を実行してみるか、pip list | grep zeep
(Linux/macOS) や pip list | findstr zeep
(Windows) コマンドで確認できます。
zeep
3.4.0 です。これらの古いPythonバージョンを使用している場合は、pip install zeep==3.4.0
のようにバージョンを指定してインストールする必要があります。しかし、これらのPythonバージョンは既にサポートが終了しているため、可能な限り新しいPythonバージョンへ移行することを強く推奨します。
また、プロジェクトで利用する際は、バージョンを固定することが推奨されます。例えば、requirements.txt
に以下のように記述します。
zeep==4.2.1 # 例: テストしたバージョンを記述
4. 基本的な使い方 🛠️
zeep
の基本的な使い方を見ていきましょう。
4.1. Clientの作成
まず、対象となるWebサービスのWSDLファイルのURLを指定してClient
オブジェクトを作成します。
from zeep import Client
# WSDLファイルのURLを指定
# 例: 公開されている天気情報サービス (現在は停止している可能性あり)
wsdl_url = 'http://www.webservicex.net/globalweather.asmx?WSDL'
# Clientオブジェクトを作成
client = Client(wsdl=wsdl_url)
print("Client作成完了!✅")
Client
オブジェクト作成時に、zeep
は指定されたWSDLファイルをダウンロードし、内容を解析してサービスやデータ型に関する情報を内部的に構築します。デフォルトでは、このWSDLファイルのキャッシュは行われないため、Client
を作成するたびにWSDLの取得リクエストが発生します。頻繁に同じWSDLを使う場合は、後述するキャッシュ設定を検討すると良いでしょう。
4.2. サービスの確認
WSDLにどのようなサービス(操作)が定義されているかを確認するには、zeep
のコマンドラインツールが便利です。
python -m zeep http://www.webservicex.net/globalweather.asmx?WSDL
このコマンドを実行すると、利用可能なプレフィックス、グローバル要素、型、バインディング、サービス、ポート、そして各操作(オペレーション)とその引数、戻り値の型などが整形されて表示されます。これにより、どのようなメソッドが呼び出せるのか、どのようなデータを渡せばよいのかを把握できます。
プログラム内から確認したい場合は、client.wsdl.dump()
を実行することでも同様の情報を得られます (ただし、これは主にデバッグ用です)。
4.3. サービスの呼び出し
サービスの呼び出しは非常に直感的です。client.service
オブジェクトの属性として、WSDLで定義された操作名にアクセスし、メソッドのように呼び出すだけです。引数はキーワード引数として渡します。
from zeep import Client
from zeep.exceptions import Fault
wsdl_url = 'http://www.webservicex.net/globalweather.asmx?WSDL'
client = Client(wsdl=wsdl_url)
try:
# GetWeather操作を呼び出す (例: 東京の天気を取得)
# 引数名はWSDLで定義されているものに合わせる (大文字小文字を区別することが多い)
response = client.service.GetWeather(CityName='Tokyo', CountryName='Japan')
# レスポンスの確認 (レスポンスはZeepオブジェクトまたはPythonネイティブ型)
print("レスポンス:")
print(response)
# レスポンスの内容にアクセス (辞書のようにアクセスできる場合が多い)
# レスポンスの構造はWSDLや実際の応答による
if response: # レスポンスがNoneでないことを確認
# 以下はレスポンスの構造に依存する例 (このAPIでは複雑なXMLが返る)
# 実際のアクセス方法はAPI仕様を確認してください
# print(f"Location: {response['Location']}")
# print(f"Temperature: {response['Temperature']}")
pass # この例では単純な表示のみ
except Fault as fault:
print(f"SOAP Faultが発生しました: {fault.message}")
print(f"詳細: {fault.detail}")
except Exception as e:
print(f"予期せぬエラーが発生しました: {e}")
zeep
は、渡されたPythonの引数(辞書など)を適切なXML形式に自動的にシリアライズし、SOAPリクエストを送信します。そして、サーバーからのSOAPレスポンス(XML)を受け取り、それをPythonオブジェクト(zeep
独自のオブジェクトやリスト、辞書、基本的なデータ型など)にデシリアライズして返します。
4.4. レスポンスの処理
レスポンスは通常、zeep
によってPythonオブジェクトに変換されています。多くの場合、辞書のようにキーでアクセスしたり、オブジェクトの属性としてアクセスしたりできます。ただし、レスポンスの正確な構造は、WSDLの定義やサーバーの実装に依存します。
レスポンスがzeep
のカスタムオブジェクトである場合、Pythonのネイティブなデータ構造(辞書やリスト)に変換したい場合があります。その際はzeep.helpers.serialize_object()
関数が便利です。
from zeep import Client, helpers
from zeep.exceptions import Fault
# (Clientの作成などは省略)
# client = Client(wsdl=wsdl_url)
try:
response_zeep_object = client.service.GetWeather(CityName='London', CountryName='UK')
if response_zeep_object:
# ZeepオブジェクトをPythonのネイティブデータ構造 (主に辞書) に変換
response_dict = helpers.serialize_object(response_zeep_object)
print("\nネイティブな辞書に変換したレスポンス:")
import pprint
pprint.pprint(response_dict)
# これで通常の辞書として扱える
# if isinstance(response_dict, dict) and 'Temperature' in response_dict:
# print(f"Temperature: {response_dict['Temperature']}")
except Fault as fault:
print(f"SOAP Fault: {fault}")
except Exception as e:
print(f"Error: {e}")
4.5. エラーハンドリング
SOAP通信では様々なエラーが発生する可能性があります。
- SOAP Fault: サーバー側で処理中にエラーが発生した場合、SOAP Faultという形式でエラー情報が返されます。
zeep
ではこれはzeep.exceptions.Fault
例外として捕捉できます。Fault
オブジェクトには、エラーメッセージ (message
) や詳細情報 (detail
) などが含まれます。 - 通信エラー: ネットワーク接続の問題やタイムアウトなどは、
requests
ライブラリ由来の例外(例:requests.exceptions.ConnectionError
,requests.exceptions.Timeout
)として発生します。 - HTTPエラー: 認証失敗 (401 Unauthorized) やサーバーエラー (500 Internal Server Error) などは、
requests.exceptions.HTTPError
として発生することがあります。 - WSDL/XMLパースエラー: WSDLファイルやレスポンスXMLの形式が不正な場合、
lxml
関連のエラーやzeep
固有のパースエラーが発生する可能性があります。
したがって、堅牢なアプリケーションを構築するためには、これらの例外を適切にtry...except
ブロックで捕捉し、処理することが重要です。
from zeep import Client
from zeep.exceptions import Fault, TransportError, XMLSyntaxError
from requests.exceptions import ConnectionError, Timeout, HTTPError
wsdl_url = 'http://invalid-or-nonexistent-url.example.com?WSDL' # 存在しないURLの例
# client = Client(wsdl=wsdl_url) # ここでエラーが発生する可能性
try:
# Client作成やサービス呼び出しをtryブロック内に記述
client = Client(wsdl=wsdl_url)
# response = client.service.SomeOperation(param='value')
# print(response)
except ConnectionError as e:
print(f"接続エラー: サーバーに接続できませんでした。URLを確認してください。詳細: {e}")
except Timeout as e:
print(f"タイムアウトエラー: サーバーからの応答が時間内にありませんでした。詳細: {e}")
except HTTPError as e:
print(f"HTTPエラー: {e.response.status_code} {e.response.reason}. 認証情報やリクエスト内容を確認してください。詳細: {e}")
except XMLSyntaxError as e:
print(f"XML構文エラー: WSDLファイルまたはレスポンスXMLの形式が不正です。詳細: {e}")
except TransportError as e:
print(f"トランスポートエラー: 通信中に問題が発生しました。詳細: {e}")
except Fault as e:
print(f"SOAPフォルト: サーバー側でエラーが発生しました。メッセージ: {e.message}, 詳細: {e.detail}")
except Exception as e:
# 予期しないその他のエラー
print(f"予期せぬエラーが発生しました: {type(e).__name__}: {e}")
5. 応用的な機能 🚀
zeep
は基本的なSOAP通信以外にも、様々な応用機能を提供しています。
5.1. Transport層のカスタマイズ
HTTP通信の詳細を制御したい場合、Transport
オブジェクトをカスタマイズします。requests
のSession
オブジェクトを利用することで、多くの設定が可能です。
from zeep import Client, Transport
from requests import Session
from requests.auth import HTTPBasicAuth # Basic認証の場合
# from requests.auth import HTTPDigestAuth # Digest認証の場合
# from requests_oauthlib import OAuth1 # OAuth1認証の場合 など
# --- セッションの設定 ---
session = Session()
# タイムアウト設定 (接続タイムアウト5秒, 読み取りタイムアウト10秒)
session.timeout = (5, 10)
# Basic認証の設定
# session.auth = HTTPBasicAuth('your_username', 'your_password')
# プロキシ設定
# proxies = {
# 'http': 'http://proxy.example.com:8080',
# 'https': 'https://proxy.example.com:8080',
# }
# session.proxies = proxies
# SSL/TLS証明書の検証を無効にする (非推奨: セキュリティリスクあり)
# import warnings
# from urllib3.exceptions import InsecureRequestWarning
# warnings.simplefilter('ignore', InsecureRequestWarning)
# session.verify = False
# カスタムヘッダーの設定
# session.headers.update({'X-Custom-Header': 'value'})
# --- TransportとClientの作成 ---
transport = Transport(session=session)
# transport = Transport(session=session, timeout=30) # Transportレベルでのタイムアウトも指定可
wsdl_url = 'your_wsdl_url_here'
client = Client(wsdl=wsdl_url, transport=transport)
# これ以降、カスタマイズされたTransport設定で通信が行われる
# response = client.service.SomeSecureOperation()
非同期処理を行いたい場合は、httpx
とAsyncTransport
を使用します。
import asyncio
from zeep import AsyncClient, Settings
from zeep.transports import AsyncTransport
from httpx import AsyncHTTPTransport, Limits
async def main():
# 非同期用のトランスポート設定
# limits = Limits(max_connections=100, max_keepalive_connections=20)
# async_transport_httpx = AsyncHTTPTransport(limits=limits, verify=True) # httpxのAsyncTransport
async_transport_zeep = AsyncTransport() # ZeepのAsyncTransport (内部でhttpxを使用)
wsdl_url = 'your_wsdl_url_here'
# settings = Settings(strict=False) # 必要に応じて設定を追加
client = AsyncClient(wsdl=wsdl_url, transport=async_transport_zeep) # , settings=settings)
try:
response = await client.service.SomeAsyncOperation(param='value')
print(response)
except Exception as e:
print(f"Error: {e}")
# asyncio.run(main()) # Python 3.7+
loop = asyncio.get_event_loop()
loop.run_until_complete(main())
5.2. SOAPヘッダーの利用
認証情報(例: WS-Security UsernameToken)やトランザクションIDなど、SOAPヘッダーで情報を送信する必要がある場合があります。_soapheaders
引数を使ってヘッダーを指定できます。
値は、辞書、xsd.Element
オブジェクト、またはlxml.etree._Element
オブジェクトで渡すことができます。WSDLにヘッダーの型定義がある場合は辞書やxsd.Element
が便利です。定義がない場合や特殊な構造の場合はlxml
オブジェクトを使うこともあります。
from zeep import Client, xsd
from zeep.wsse.username import UsernameToken
# from zeep.wsse.signature import Signature # X.509署名を使う場合
# --- Clientの作成 (Transport設定などは適宜行う) ---
# client = Client(...)
# 方法1: WS-Security UsernameToken を使う (Zeepが提供する便利な方法)
# transport = Transport(session=session) # transportの設定は必要
# client = Client(wsdl=wsdl_url, transport=transport, wsse=UsernameToken('user', 'pass', use_digest=True)) # use_digest=Trueでパスワードダイジェストを使用
# response = client.service.SomeOperationNeedingAuth(param='value') # ヘッダーは自動で付与される
# 方法2: 辞書でヘッダーを指定 (WSDLにヘッダー定義がある場合)
# header_data = {
# 'AuthToken': 'your_secret_token',
# 'SessionID': 12345
# }
# response = client.service.SomeOperation(param='value', _soapheaders=header_data)
# 方法3: xsd.Element でカスタムヘッダーを作成
# header_element = xsd.Element(
# '{http://example.com/auth}AuthHeader', # 名前空間と要素名
# xsd.ComplexType([
# xsd.Element('{http://example.com/auth}user', xsd.String()),
# xsd.Element('{http://example.com/auth}token', xsd.String()),
# ])
# )
# header_value = header_element(user='myuser', token='abcxyz')
# response = client.service.SomeOperation(param='value', _soapheaders=[header_value]) # リストで渡すことも可能
# 方法4: lxml要素でヘッダーを作成 (WSDL定義がない場合など)
# from lxml import etree
# nsmap = {'custom': 'http://my.custom.header.namespace.com'}
# custom_header = etree.Element("{%s}MyHeader" % nsmap['custom'], nsmap=nsmap)
# sub_element = etree.SubElement(custom_header, "{%s}Value" % nsmap['custom'])
# sub_element.text = "SpecialValue"
# response = client.service.SomeOperation(param='value', _soapheaders=[custom_header])
# print(response)
WS-Security (WSSE) については、UsernameTokenとX.509署名の両方をサポートしています。詳細は公式ドキュメントのWSSEセクションを参照してください。
5.3. 複雑なデータ型の扱い
WSDLでは、単純な文字列や数値だけでなく、ネストされた構造やリスト、特定の制約を持つ型などが定義されることがあります。zeep
はこれらの複雑な型を扱うための機能を提供します。
- 型の取得とオブジェクト生成:
client.get_type()
メソッドで特定の型定義(例:'ns0:Person'
)を取得し、それを使ってPythonオブジェクトを生成できます。生成したオブジェクトに属性を設定し、サービス呼び出しの引数として渡します。 - ファクトリの利用:
client.type_factory('namespace_prefix')
で特定の名前空間に対応するファクトリオブジェクトを取得できます。このファクトリを使って、その名前空間内の型オブジェクトをより簡単に生成できます(例:factory.Person(name='Alice', age=30)
)。 - リスト/配列: WSDLで配列として定義されている要素には、Pythonのリストを渡します。
- AnyType/Any:
xsd:anyType
やxsd:any
として定義されている要素には、zeep.xsd.AnyObject
を使って任意のXML構造を埋め込むことができます。 - Choice:
xsd:choice
で定義されている場合、選択肢のうちの1つの要素のみを設定します。 - SkipValue: オプショナルな要素に値を設定したくない場合、
zeep.xsd.SkipValue
を渡すことで、その要素をリクエストXMLから除外できます(デフォルトではNone
を渡すとxsi:nil="true"
が付与されることがあります)。
from zeep import Client, xsd
# (Clientの作成などは省略)
# client = Client(wsdl_url)
try:
# 型を取得してオブジェクト生成
PersonType = client.get_type('ns0:Person') # 名前空間'ns0'の'Person'型を取得 (名前空間と型名はWSDLに依存)
person_obj = PersonType(name='Bob', age=25, address={'street': '123 Main St', 'city': 'Anytown'})
# ファクトリを使ってオブジェクト生成
factory = client.type_factory('ns0') # 名前空間'ns0'のファクトリを取得
address_obj = factory.Address(street='456 Oak Ave', city='Otherville')
person_obj_from_factory = factory.Person(name='Charlie', age=40, address=address_obj)
# リストを含むオブジェクト
item_type = factory.Item # Item型を取得 (仮定)
items_list = [item_type(id=1, name='Apple'), item_type(id=2, name='Banana')]
order_obj = factory.Order(orderId='XYZ', items=items_list)
# オプショナルな要素をスキップ
optional_field_obj = factory.SomeType(mandatoryField='value', optionalField=xsd.SkipValue)
# サービス呼び出し
# response = client.service.ProcessPerson(person=person_obj)
# response = client.service.SubmitOrder(order=order_obj)
# response = client.service.HandleOptional(data=optional_field_obj)
# print(response)
except Exception as e:
print(f"Error creating or using complex types: {e}")
5.4. プラグイン
zeep
にはプラグイン機構があり、リクエストの送信前やレスポンスの受信後などに独自の処理を挟むことができます。組み込みプラグインとしては、送受信したXML履歴を記録するHistoryPlugin
があります。
from zeep import Client, Transport, Settings
from zeep.plugins import HistoryPlugin
from requests import Session
session = Session()
# ... session設定 ...
transport = Transport(session=session)
history = HistoryPlugin()
wsdl_url = 'your_wsdl_url_here'
client = Client(wsdl=wsdl_url, transport=transport, plugins=[history])
try:
# サービス呼び出し
response = client.service.SomeOperation(param='value')
print(response)
# 履歴の確認
print("\n--- 送信XML ---")
# history.last_sent['envelope'] は lxml の Element オブジェクト
from lxml import etree
print(etree.tostring(history.last_sent['envelope'], encoding='unicode', pretty_print=True))
print("\n--- 受信XML ---")
# history.last_received['envelope'] も lxml の Element オブジェクト
print(etree.tostring(history.last_received['envelope'], encoding='unicode', pretty_print=True))
except Exception as e:
print(f"Error: {e}")
カスタムプラグインを作成することで、独自のロギング、リクエスト/レスポンスの改変、署名の追加など、より高度なカスタマイズが可能になります。
5.5. WSDL/XSDのキャッシュ
毎回Client
を初期化する際にWSDLとその関連ファイル(インポートされたXSDなど)を取得するのは非効率な場合があります。Transport
にキャッシュを設定することで、取得したファイルをローカルに保存し、次回以降の初期化を高速化できます。
from zeep import Client, Transport
from zeep.cache import SqliteCache # SQLiteベースのキャッシュ
# from zeep.cache import InMemoryCache # メモリ内キャッシュ
from requests import Session
session = Session()
# ... session設定 ...
# キャッシュを設定したTransportを作成 (デフォルトでは ~/.cache/zeep に sqlite ファイルが作成される)
# cache_path = '/path/to/your/cache.db' # パス指定も可能
cache = SqliteCache(timeout=3600) # キャッシュ有効期間を秒で指定 (例: 1時間)
# cache = InMemoryCache(timeout=600) # メモリキャッシュ (プロセス終了で消える)
transport = Transport(session=session, cache=cache)
wsdl_url = 'your_wsdl_url_here'
# 初回はWSDLを取得しキャッシュに保存
print("初回 Client 作成中...")
client1 = Client(wsdl=wsdl_url, transport=transport)
print("初回 Client 作成完了.")
# 2回目以降はキャッシュから読み込むため高速
print("2回目 Client 作成中...")
client2 = Client(wsdl=wsdl_url, transport=transport)
print("2回目 Client 作成完了.")
6. よくあるユースケースとヒント 💡
ユースケース
- レガシーシステム連携: 多くの既存システム(特にエンタープライズ向け)はSOAP APIを提供しています。
zeep
はこれらのシステムとPythonアプリケーションを連携させる際の強力なツールとなります。 - 外部Webサービス利用: 金融情報、気象情報、政府系APIなど、公共または商用のWebサービスの中にはSOAP形式で提供されているものがあります。
- 社内マイクロサービス連携: 稀なケースかもしれませんが、社内システム間連携にSOAPが使われている場合に利用できます。
- テスト自動化: SOAPベースのAPIをテストする際のクライアントとして
zeep
を利用できます。
ヒントとベストプラクティス
- WSDLをよく読む: まずはコマンドラインツール (
python -m zeep <wsdl_url>
) やブラウザでWSDLファイルの内容を確認し、利用可能な操作、必要なパラメータ、データ型、名前空間を理解しましょう。 - 適切なエラーハンドリング:
Fault
例外や通信エラーなど、想定されるエラーを網羅的にハンドリングし、問題発生時に適切なログ出力やユーザー通知を行うようにしましょう。 - Transportの活用: 認証、タイムアウト、プロキシ、キャッシュなど、通信に関する設定は
Transport
とSession
で行うのが基本です。 - デバッグにはHistoryPlugin: 送受信された実際のXMLを確認したい場合は、
HistoryPlugin
が非常に役立ちます。期待通りのリクエストが送られているか、サーバーからどのようなレスポンスが返ってきているかを確認できます。Python標準のlogging
モジュールと組み合わせることで、より詳細なデバッグ情報を得ることも可能です。 - 型の利用: 複雑なデータ構造を扱う場合は、
get_type()
やtype_factory()
を積極的に利用して、型安全なコードを記述しましょう。 - バージョン固定: 開発環境と本番環境で
zeep
および依存ライブラリのバージョンをrequirements.txt
などで固定し、環境差による問題を避けましょう。 - 公式ドキュメント参照:
zeep
は非常によくできたドキュメント (https://docs.python-zeep.org/) を提供しています。困ったときや詳細を知りたいときは、まず公式ドキュメントを確認しましょう。
7. 代替ライブラリ 🤔
zeep
が最も推奨されることが多いですが、過去には他のSOAPライブラリも存在しました(あるいは現在もメンテナンスされているものもあります)。
- suds (特に suds-jurko フォーク): かつては非常に人気がありましたが、オリジナルの
suds
は長らくメンテナンスされていません。いくつかのフォークが存在し、suds-jurko
などが比較的最近まで更新されていた時期もありましたが、zeep
ほどの活発さはありません。 - pysimplesoap: シンプルさを特徴とするライブラリですが、
zeep
ほど高機能ではなく、メンテナンス状況も確認が必要です。 - requests + lxml (手動): ライブラリに頼らず、
requests
でHTTP通信を行い、lxml
で送受信するXMLを自前で構築・解析する方法もあります。非常に柔軟な対応が可能ですが、開発コストは大幅に増加します。zeep
がうまく対応できない特殊なケースや、学習目的以外ではあまり推奨されません。
特別な理由がない限り、現在PythonでSOAPクライアントを実装する場合は、zeep
を選択するのが最も現実的で効率的な選択と言えるでしょう。
8. まとめ 🎉
zeep
は、PythonでSOAP Webサービスを利用するための、モダンで高機能、かつ使いやすいライブラリです。WSDLの自動解析、PythonicなAPI、豊富なカスタマイズオプションにより、SOAP通信の実装を大幅に簡略化してくれます。
この記事では、zeep
の基本的な使い方から、認証、エラーハンドリング、複雑な型の扱い、プラグインといった応用的な機能までを解説しました。REST APIが主流の時代ではありますが、SOAPを利用する必要がある場面に遭遇した際には、ぜひzeep
を活用して、効率的で信頼性の高い開発を進めてください。 Happy coding! 😊
コメント