NissyBlog

Life goes on.

PythonでSOAP通信するためにやったこと

この記事はPython Advent Calendar 2016 - Qiitaの6日目の記事になります。
こんにちは。@nissy0409240です。

Webを支える技術

突然ですが、「Webを支える技術」という本はご存知でしょうか。

Webを支える技術 -HTTP、URI、HTML、そしてREST (WEB+DB PRESS plus)

Webを支える技術 -HTTP、URI、HTML、そしてREST (WEB+DB PRESS plus)

こちらの本では、昨今の主流となりつつあるRestfulなアーキテクチャとはどの様なものかを
理解する為に必要な考えが記載されています。

また、この本の中ではREST形式だけでなくSOAP形式というプロトコルの紹介や、
なぜSOAP形式ではなくREST形式が主流となっていったのかという歴史的経緯も紹介されています。
この本の中ではRESTが普及しつつあると述べられていますが、
現在もSOAP通信を必要とするケースはまだまだ存在しています。

とある機会があり、SOAPライブラリを使ったコードをPythonで書く機会がありました。
本エントリーではその時に使ったライブラリの紹介をしたいと思います。

本エントリーで使用するSOAPライブラリの紹介

早速ではございますが、今回使用したPythonで使えるSOAPライブラリである
suds-jurkoの紹介をさせて頂きます。
bitbucket.org
suds-jurkoとは、現在は開発が止まっているInfrastructure/Fedorahosted-retirement - Fedora Project Wikiをfolkして
現在も継続してメンテナンスをしているモジュールになります。
PyPIを見てみると、
suds · PyPI
sudsは2010年以降、アップデートはされていませんが、
suds-jurko · PyPI
suds-jurkoはsudsの最終更新日以降もアップデートがされており、
下記に掲載した公式ドキュメントには、比較的新しいバージョンのPythonも使用可能との記載もございます。
jurko / suds — Bitbucket

なお、suds-jurkoのインストール自体は下記の通り、

$ pip install suds-jurko
Collecting suds-jurko
  Downloading suds-jurko-0.6.tar.bz2 (143kB)
    100% |████████████████████████████████| 153kB 2.8MB/s
Installing collected packages: suds-jurko
  Running setup.py install for suds-jurko ... done
Successfully installed suds-jurko-0.6

pip installでインストールすることが出来ます。

実装

早速、suds-jurkoを使ってみようと思います。

#!/usr/bin/env python
# coding: utf-8
#

from suds.client import Client

if __name__ == "__main__":
    url = "http://wsf.cdyne.com/WeatherWS/Weather.asmx?WSDL"
    client = Client(url)
    print(client)

さきほど掲載したPyPIへのリンクと公式ドキュメントを見てピンと来た方もいらっしゃるかと思いますが、
PyPIには「suds-jurko」というパッケージ名で登録されていますが、
ソースコード自体は「suds」のままなので、
import時は「suds」モジュールを指定すれば問題ありません。

また、実行結果はこちらになります。

$ python suds_jurko_demo.py

Suds ( https://fedorahosted.org/suds/ )  version: 0.6

Service ( Weather ) tns="http://ws.cdyne.com/WeatherWS/"
   Prefixes (1)
      ns0 = "http://ws.cdyne.com/WeatherWS/"
   Ports (2):
      (WeatherSoap)
         Methods (3):
            GetCityForecastByZIP(xs:string ZIP)
            GetCityWeatherByZIP(xs:string ZIP)
            GetWeatherInformation()
         Types (8):
            ArrayOfForecast
            ArrayOfWeatherDescription
            Forecast
            ForecastReturn
            POP
            WeatherDescription
            WeatherReturn
            temp
      (WeatherSoap12)
         Methods (3):
            GetCityForecastByZIP(xs:string ZIP)
            GetCityWeatherByZIP(xs:string ZIP)
            GetWeatherInformation()
         Types (8):
            ArrayOfForecast
            ArrayOfWeatherDescription
            Forecast
            ForecastReturn
            POP
            WeatherDescription
            WeatherReturn
            temp

最後になりますが、今回作成した検証用スクリプトはこちらになります。
github.com

最後までお付き合い頂き、ありがとうございました。

※参考
Pythonで使えるSOAPライブラリについて調べた (2011/02版) - YAMAGUCHI::weblog
GitHub - raquel-ucl/suds-jurko: Playing around with suds