web-dev-qa-db-ja.com

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

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クライアントで正常に動作します。

119
DavidM

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

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

49
Yusufk

非常に有望で、まだ文書化されていないものの、比較的新しいライブラリがあり、非常にクリーンでPythonicのようです: python zeep

例については this answer も参照してください。

19
lorenzog

私は最近、同じ問題につまずいた。私のソリューションの概要は次のとおりです。

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

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

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

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

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
      },
 })
19
Teddy Belay

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

9
Matthew Scouten

ZeepはSOAPのまともなPythonライブラリであり、あなたが求めているものと一致します: http://docs.python-zeep.org

5
Hanni Ali

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

私はこれをやめるためにJavaをあきらめて使用しましたneededwantedこれを行うことはできましたが、必須ではありませんでした。

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

難しいことではありませんが、特に時間がかかり、エラーが発生しやすい、特にフィールドの名前が一貫していない場合(現在作業中のフィールド)今日は「jobId」、「JobId」、「JobID」があります。soapUIを使用してWSDLをロードし、エンドポイントなどの抽出と手動テストの実行を容易にします。私が使用しているWSDL。

5
Hywel Thomas

SOAPpyはPython 2.5では動作しません-非常にシンプルで、本当に、本当に基本的ですが、動作します。より複雑なWebサービスと話したい場合は、ZSIが唯一の友人です。

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

2
zgoda

SOAPpyは廃止され、AFAIKがZSLに置き換えられました。 Python 2.5またはPython 2.6のいずれかで動作させることはできませんが、コンパイルすることはできません。

1
user122299
#!/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']))
1
Down the Stream

独自のロールを作成する場合は、 http://effbot.org/zone/element-soap.htm を参照することを強くお勧めします。

1
sj26