PythonでWSDL(SOAP)Webサービスを使用するにはどうすればよいですか?


124

PythonでWSDL SOAPベースのWebサービスを使用したい。私はDive Into Pythonコードを調べましたが、SOAPpyモジュールはPython 2.5では機能しません。

私が使って試してみました一部が動作しますが、特定の種類(suds.TypeNotFound:タイプ見つかりません:「アイテム」)で休憩。

私もクライアントを見ましたが、これはWSDLをサポートしていないようです。

そして、私が見てきましたZSIが、それは非常に複雑に見えます。誰かがそのためのサンプルコードを持っていますか?

WSDLはhttps://ws.pingdom.com/soap/PingdomAPI.wsdlであり、PHP 5 SOAPクライアントで正常に動作します。


3
受け入れた回答を変更することを検討しますか?現在受け入れられている答えは-1で、+ 19の別の答えがあります。私はこれが2008年からであることを知っています。私が提案しているだけです。
Mark E. Haase

SUDSは、WSDLを適切に解析できなかったため機能しませんでしたが、それ以外の場合は良い選択です。だから私はいくつかの選択肢があるチュートリアルをダイブからPythonに変更しました。補足として、PingdomにはREST API pingdom.com/services/api-documentation-restがあり、クライアントライブラリはblog.pingdom.com/2011/04/11/pingdom-rest-api-wrappers
davidmytton

回答:


49

SUDSをご覧になることをお勧めします

「SudsはWebサービスを利用するための軽量SOAP pythonクライアントです。」


出向。Sudsはすぐに理解でき、クラスの生成はありません。WSDLをライブでロードし、すぐに使用できるオブジェクトを作成します。
EnigmaCurry、2011

19
再帰的なインポートでWSDLを開くと、Sudsに無限再帰の問題があります。これはSudsによってブロッキングバグと見なされ、この問題は3年以上前に作成されましたが、まだ修正されていません。 fedorahosted.org/suds/ticket/239 Sudsが2012年の使用に適しているかどうか疑問に思いますか?
Buttons840

2
が死んでいるようです。Long live SUDS- これはアクティブなフォークのようです。
nerdoc 2017年

3
これが一番の答えですが、今日うまくいく答えを誰かが探しているなら、新しい答えも示唆しているように、Zeepを検討してください。
Tobias Feil

25

非常に有望であり、まだ十分に文書化されていませんが、非常にクリーンでpythonicである比較的新しいライブラリがあります:python zeep

例については、この回答も参照してください。


2
+1。今日ジープを試してみましたが、意外と使いやすかったです。3行のコードでSoap 1.1 / 1.2サービスを利用して呼び出すことができました。
Jagu

20

最近、同じ問題に遭遇しました。これが私の解決策の概要です:

必要な基本的な構成コードブロック

以下は、クライアントアプリケーションの必須の基本コードブロックです。

  1. セッション要求セクション:プロバイダーとのセッションを要求します
  2. セッション認証セクション:プロバイダーに資格情報を提供します
  3. クライアントセクション:クライアントの作成
  4. セキュリティヘッダーセクション:クライアントへのWS-Securityヘッダーの追加
  5. 消費セクション:必要に応じて利用可能な操作(またはメソッド)を消費します

どのモジュールが必要ですか?

多くの人がurllib2などのPythonモジュールの使用を提案しました。ただし、少なくともこの特定のプロジェクトでは、どのモジュールも機能しません。

だから、ここにあなたが取得する必要があるモジュールのリストがあります。まず、次のリンクから最新バージョンのsudsをダウンロードしてインストールする必要があります。

pypi.python.org/pypi/suds-jurko/0.4.1.jurko.2

さらに、次のリンクからそれぞれリクエストとsuds_requestsモジュールをダウンロードしてインストールする必要があります(免責事項:私はここに投稿するのが初めてなので、今のところ複数のリンクを投稿することはできません)。

pypi.python.org/pypi/requests

pypi.python.org/pypi/suds_requests/0.1

これらのモジュールのダウンロードとインストールに成功したら、準備完了です。

コード

前述の手順に従うと、コードは次のようになります。インポート:

import logging
from suds.client import Client
from suds.wsse import *
from datetime import timedelta,date,datetime,tzinfo
import requests
from requests.auth import HTTPBasicAuth
import suds_requests

セッション要求と認証:

username=input('Username:')
password=input('password:')
session = requests.session()
session.auth=(username, password)

クライアントを作成します。

client = Client(WSDL_URL, faults=False, cachingpolicy=1, location=WSDL_URL, transport=suds_requests.RequestsTransport(session))

WS-Securityヘッダーを追加します。

...
addSecurityHeader(client,username,password)
....

def addSecurityHeader(client,username,password):
    security=Security()
    userNameToken=UsernameToken(username,password)
    timeStampToken=Timestamp(validity=600)
    security.tokens.append(userNameToken)
    security.tokens.append(timeStampToken)
    client.set_options(wsse=security)

この方法では、図1に示すセキュリティヘッダーが作成されることに注意してください。したがって、使用しているサービスの所有者から提供された正しいセキュリティヘッダー形式によって、実装が異なる場合があります。

関連するメソッド(または操作)を使用します。

result=client.service.methodName(Inputs)

ロギング

このような実装におけるベストプラクティスの1つは、通信がどのように実行されるかを確認するためのロギングです。問題が発生した場合、デバッグが容易になります。次のコードは基本的なロギングを行います。ただし、コードに示されているものに加えて、通信の多くの側面をログに記録できます。

logging.basicConfig(level=logging.INFO) 
logging.getLogger('suds.client').setLevel(logging.DEBUG) 
logging.getLogger('suds.transport').setLevel(logging.DEBUG)

結果:

これが私の場合の結果です。サーバーがHTTP 200を返したことに注意してください。これは、HTTP要求/応答の標準の成功コードです。

(200, (collectionNodeLmp){
   timestamp = 2014-12-03 00:00:00-05:00
   nodeLmp[] = 
      (nodeLmp){
         pnodeId = 35010357
         name = "YADKIN"
         mccValue = -0.19
         mlcValue = -0.13
         price = 36.46
         type = "500 KV"
         timestamp = 2014-12-03 01:00:00-05:00
         errorCodeId = 0
      },
      (nodeLmp){
         pnodeId = 33138769
         name = "ZION 1"
         mccValue = -0.18
         mlcValue = -1.86
         price = 34.75
         type = "Aggregate"
         timestamp = 2014-12-03 01:00:00-05:00
         errorCodeId = 0
      },
 })

1
それは言っての価値があるかもしれませんsuds_requestあなたが使用している場合ので、インストール中に失敗しますsuds-jurkoフォークを、インストールすることができますsuds_request:泡のjurkoのバージョンで動作するように適応されたpip install git+https://github.com/chrcoe/suds_requests.git@feature/python3_suds_jurko
エラッタ

7

現在(2008年現在)、Pythonで利用可能なすべてのSOAPライブラリが機能していません。できればSOAPを使用しないことをお勧めします。前回、PythonからSOAP Webサービスを使用することを強制されたときに、一方の側でSOAPを処理し、もう一方の側でCOMを読み上げるラッパーをC#で作成しました。


15
これは、xmlとhttpに基づく単純なプロトコルを使用するめちゃくちゃ複雑な方法のように聞こえます。
ddaa 2012年

1
当時、2008年には、これは私たちのニーズを最小限に抑える方法でした。その特定のWebサービスは、すべてのpythonライブラリーが間違っていることについて非常にうるさいことを覚えているようです。
Matthew Scouten、2012年

1
2019、python zeep、sud、まだ多くの解析非互換性の問題が発生しやすい。wsdlドキュメントを適切に維持しないと、これらのモジュールはノンストップの爆竹のように例外をスローします。
mootmoot


6

私は定期的にこれに対する満足のいく答えを探しますが、今のところ運がありません。私はsoapUI +リクエスト+手作業を使用しています。

前回、これを行う必要があったときにJavaをあきらめて使用し、最後にこれを実行したいときに数回あきらめましたが、それは必須ではありませんでした。

Project PlaceのRESTful APIで昨年リクエストライブラリをうまく使用していたので、同じ方法で送信したいSOAPリクエストをハンドロールするだけでよいのではないかと思いました。

それそれほど難しくはありませんが、特にフィールドに一貫性のない名前が付けられている場合は特に時間がかかり、エラーが発生しやすいことがわかります(現在私が現在取り組んでいるものは、「jobId」、JobId、および「JobID」です。私はsoapUIを使用してロードしますエンドポイントの抽出や手動テストの実行を容易にするために、WSDLを使用しています。これまでのところ、使用しているWSDLの変更による影響を受けなかったのは幸運でした。


3

SOAPpyがPython 2.5で機能しないのは本当ではありません-それは機能しますが、非常にシンプルで、本当に基本的なものです。より複雑なWebサービスと通信したい場合は、ZSIが唯一の友達です。

私が見つけた本当に便利なデモはhttp://www.ebi.ac.uk/Tools/webservices/tutorials/pythonにあります -これは本当にZSIがどのように機能するかを理解するのに役立ちました。


1
python setup.py installは最新リリースでエラーを出します。最新のdevコピーは機能するかもしれませんが、それはやるのが面倒です。
davidmytton 2008


1

SOAPpyは廃止され、AFAIK、ZSLに置き換えられました。Python 2.5とPython 2.6のどちらでも、どちらかを動作させることができず、コンパイルを大幅に減らすことができるため、これは議論の余地があります。


1
#!/usr/bin/python
# -*- coding: utf-8 -*-
# consume_wsdl_soap_ws_pss.py
import logging.config
from pysimplesoap.client import SoapClient

logging.config.dictConfig({
    'version': 1,
    'formatters': {
        'verbose': {
            'format': '%(name)s: %(message)s'
        }
    },
    'handlers': {
        'console': {
            'level': 'DEBUG',
            'class': 'logging.StreamHandler',
            'formatter': 'verbose',
        },
    },
    'loggers': {
        'pysimplesoap.helpers': {
            'level': 'DEBUG',
            'propagate': True,
            'handlers': ['console'],
        },
    }
})

WSDL_URL = 'http://www.webservicex.net/stockquote.asmx?WSDL'
client = SoapClient(wsdl=WSDL_URL, ns="web", trace=True)
client['AuthHeaderElement'] = {'username': 'someone', 'password': 'nottelling'}

#Discover operations
list_of_services = [service for service in client.services]
print(list_of_services)

#Discover params
method = client.services['StockQuote']

response = client.GetQuote(symbol='GOOG')
print('GetQuote: {}'.format(response['GetQuoteResult']))


出力例:... DEBUG:pysimplesoap.helpers:complexContent / simpleType / element string = string [u'StockQuote '] GetQuote:<StockQuotes> <Stock> <Symbol> GOOG </ Symbol> <Last> 816.13 </ Last> <Da​​te> 3/23/2017 </ Date> <Time> 11:41 am </ Time> <Change> -13.46 </ Change> <Open> 820.01 </ Open> <High> 822.57 </ High> <Low> 812.26 </ Low> <Volume> 1973140 </ Volume> <MktCap> 564.29B </ MktCap> <PreviousClose> 829.59 </ PreviousClose> <PercentageChange> -1.62%</ PercentageChange> <AnnRange> 663.28-853.50 </ AnnRange> <Earns> 27.88 </ Earns> <PE> 29.28 </ PE> <Name> Alphabet Inc。</ Name> </ Stock> </ StockQuotes>
ダウンストリーム

pysimplesoap / client.py:757のPython3で失敗します-'dict'オブジェクトには属性 'iteritems'がありません
ierdna

どうやらPIPに付属しているバージョンが壊れています。GITから手動でインストールする必要があります-修正されます
ierdna

良い点:このリンクを参照してください。stackoverflow.com/questions/13998492/iteritems-in-python 「dict.itemsが今事dict.iteritemsは、Python 2でやったんのでdict.iteritemsは削除されました...」
ダウンストリーム
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.