PythonでWSDL SOAPベースのWebサービスを使用したい。 Dive Into Python コードを見ましたが、SOAPpyモジュールはPython 2.5では機能しません。
suds を使用してみましたが、これは部分的に機能しますが、特定のタイプ(suds.TypeNotFound:Type not found: 'item')で壊れます。
Client も見てきましたが、これはWSDLをサポートしていないようです。
そして、私は ZSI を見てきましたが、非常に複雑に見えます。誰かがそれのためのサンプルコードを持っていますか?
WSDLは https://ws.pingdom.com/soap/PingdomAPI.wsdl であり、PHP 5 SOAPクライアントで正常に動作します。
SUDS をご覧になることをお勧めします
「Sudsは、Webサービスを使用するための軽量のSOAP pythonクライアントです。」
非常に有望で、まだ文書化されていないものの、比較的新しいライブラリがあり、非常にクリーンでPythonicのようです: python zeep 。
例については this answer も参照してください。
私は最近、同じ問題につまずいた。私のソリューションの概要は次のとおりです。
必要な基本構成コードブロック
以下は、クライアントアプリケーションに必要な基本的なコードブロックです。
どのモジュールが必要ですか?
Urllib2などのPythonモジュールを使用することを多くの人が提案しました。ただし、少なくともこの特定のプロジェクトでは機能するモジュールはありません。
それで、ここにあなたが得る必要があるモジュールのリストがあります。まず、次のリンクから最新バージョンの泡をダウンロードしてインストールする必要があります。
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
},
})
現在(2008年現在)、SOAP suckに使用可能なすべてのPythonライブラリがあります。可能であれば、SOAPを避けることをお勧めします。前回、PythonからSOAP Webサービスを使用することを余儀なくされたときに、一方のSOAPを処理し、もう一方のCOMを読み上げるC#のラッパーを作成しました。
ZeepはSOAPのまともなPythonライブラリであり、あなたが求めているものと一致します: http://docs.python-zeep.org
私はこれに対する満足できる答えを定期的に探していますが、これまでのところ運はありません。 soapUI +リクエスト+手作業を使用しています。
私はこれをやめるためにJavaをあきらめて使用しましたneeded。 wantedこれを行うことはできましたが、必須ではありませんでした。
昨年Project PlaceのRESTful APIでリクエストライブラリを正常に使用した後、同様の方法で送信したいSOAPリクエストをハンドロールするだけでよいのではないかと思いました。
難しいことではありませんが、特に時間がかかり、エラーが発生しやすい、特にフィールドの名前が一貫していない場合(現在作業中のフィールド)今日は「jobId」、「JobId」、「JobID」があります。soapUIを使用してWSDLをロードし、エンドポイントなどの抽出と手動テストの実行を容易にします。私が使用しているWSDL。
SOAPpyはPython 2.5では動作しません-非常にシンプルで、本当に、本当に基本的ですが、動作します。より複雑なWebサービスと話したい場合は、ZSIが唯一の友人です。
私が見つけた本当に便利なデモは http://www.ebi.ac.uk/Tools/webservices/tutorials/python にあります-これはZSIの仕組みを理解するのに本当に役立ちました。
SOAPpyは廃止され、AFAIKがZSLに置き換えられました。 Python 2.5またはPython 2.6のいずれかで動作させることはできませんが、コンパイルすることはできません。
#!/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']))
独自のロールを作成する場合は、 http://effbot.org/zone/element-soap.htm を参照することを強くお勧めします。