最近、同じ問題に遭遇しました。これが私の解決策の概要です:
必要な基本的な構成コードブロック
以下は、クライアントアプリケーションの必須の基本コードブロックです。
- セッション要求セクション:プロバイダーとのセッションを要求します
- セッション認証セクション:プロバイダーに資格情報を提供します
- クライアントセクション:クライアントの作成
- セキュリティヘッダーセクション:クライアントへのWS-Securityヘッダーの追加
- 消費セクション:必要に応じて利用可能な操作(またはメソッド)を消費します
どのモジュールが必要ですか?
多くの人が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
},
})