Python'da WSDL (SOAP) web hizmetini nasıl kullanabilirim?


124

Python'da WSDL SOAP tabanlı bir web hizmeti kullanmak istiyorum. Dive Into Python koduna baktım ama SOAPpy modülü Python 2.5 altında çalışmıyor.

Kısmen çalışan, ancak belirli türlerle kesilen suds kullanmayı denedim (suds.TypeNotFound: Tür bulunamadı: 'öğe').

İstemciye de baktım ancak bu WSDL'yi desteklemiyor gibi görünüyor.

Ve ZSI'ye baktım ama çok karmaşık görünüyor. Bunun için herhangi bir örnek kodu olan var mı?

WSDL, https://ws.pingdom.com/soap/PingdomAPI.wsdl'dir ve PHP 5 SOAP istemcisi ile iyi çalışır.


3
Kabul edilen cevabınızı değiştirmeyi düşünür müsünüz? Şu anda kabul edilen cevap -1 ve +19 ile başka bir cevap var. Bunun 2008'den olduğunu biliyorum; Ben sadece öneriyorum.
Mark E. Haase

SUDS, WSDL'yi düzgün bir şekilde ayrıştıramadığı için çalışmadı, ancak aksi takdirde iyi bir seçim olurdu. Bu yüzden cevabı, bazı alternatifleri olan Dive Into Python'dan bir öğreticiye değiştirdim. Bir yan not olarak, Pingdom artık blog.pingdom.com/2011/04/11/pingdom-rest-api-wrappers
davidmytton

Yanıtlar:


49

SUDS'a bir göz atmanızı tavsiye ederim

"Suds, Web Hizmetlerini tüketmek için hafif bir SOAP python istemcisidir."


Destekliyorum. Suds benim için hemen mantıklı geldi, sınıf üretimi yok, WSDL'yi canlı yükler ve ondan hemen kullanabileceğiniz bir nesne oluşturur.
EnigmaCurry

19
Suds, WSDL'yi yinelemeli içe aktarmalarla açarken sonsuz bir özyineleme sorununa sahiptir. Bu, Suds tarafından engelleyici bir hata olarak kabul edilir ve sorun 3 yıldan daha uzun bir süre önce oluşturuldu, ancak henüz düzeltilmedi. fedorahosted.org/suds/ticket/239 Suds'un 2012'de kullanıma uygun olup olmadığını merak etmeme neden oluyor mu?
Buttons840

2
köpük ölmüş görünüyor. Yaşasın SUDS - bu aktif Çatal gibi görünüyor.
nerdoc

3
Bu en iyi cevap, ancak bugün işe yarayan bir cevap arayan biri varsa , yeni cevapların da önerdiği gibi Zeep'i düşünün .
Tobias Feil

25

Oldukça ümit verici olan ve yine de yeterince belgelenmemiş olmasına rağmen, oldukça temiz ve pitonik görünen nispeten yeni bir kütüphane var: python zeep .

Bir örnek için bu yanıta da bakınız .


2
Bunun için +1. Bugün zeep'i denedim ve kullanımı şaşırtıcı derecede kolaydı. 3 satır kod ile Soap 1.1 / 1.2 servisini kullanıp çağırabildi.
Jagu

20

Geçenlerde aynı sorunla karşılaştım. İşte çözümümün özeti:

Temel kurucu kod blokları gerekli

Aşağıdakiler, istemci uygulamanız için gerekli temel kod bloklarıdır

  1. Oturum isteği bölümü: sağlayıcıyla bir oturum talep edin
  2. Oturum kimlik doğrulama bölümü: sağlayıcıya kimlik bilgileri sağlayın
  3. İstemci bölümü: İstemciyi oluşturun
  4. Güvenlik Başlığı bölümü: WS-Security Başlığını İstemciye ekleyin
  5. Tüketim bölümü: gerektiğinde mevcut işlemleri (veya yöntemleri) kullanın

Hangi modüllere ihtiyacınız var?

Birçoğu urllib2 gibi Python modüllerini kullanmayı önerdi; ancak, modüllerin hiçbiri çalışmıyor - en azından bu özel proje için.

İşte almanız gereken modüllerin listesi. Her şeyden önce, aşağıdaki bağlantıdan suds'ın en son sürümünü indirip yüklemeniz gerekir:

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

Ek olarak, sırasıyla aşağıdaki bağlantılardan istekleri ve suds_requests modüllerini indirmeniz ve yüklemeniz gerekir (sorumluluk reddi: Burada yayınlamak için yeniyim, bu nedenle şimdilik birden fazla bağlantı gönderemiyorum).

pypi.python.org/pypi/requests

pypi.python.org/pypi/suds_requests/0.1

Bu modülleri başarıyla indirip kurduktan sonra, gitmekte fayda var.

Kod

Daha önce açıklanan adımları izleyerek, kod aşağıdaki gibi görünür: İçe Aktarmalar:

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

Oturum isteği ve kimlik doğrulama:

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

İstemciyi Oluşturun:

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

WS-Security Başlığı Ekle:

...
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)

Lütfen bu yöntemin Şekil 1'de gösterilen güvenlik başlığını oluşturduğuna dikkat edin. Dolayısıyla, uygulamanız, tüketmekte olduğunuz hizmetin sahibi tarafından sağlanan doğru güvenlik başlığı biçimine bağlı olarak değişebilir.

İlgili yöntemi (veya işlemi) kullanın:

result=client.service.methodName(Inputs)

Günlük kaydı :

Bu tür uygulamalardaki en iyi uygulamalardan biri, iletişimin nasıl yürütüldüğünü görmek için günlüğe kaydetmektir. Bir sorun olması durumunda, hata ayıklamayı kolaylaştırır. Aşağıdaki kod, temel günlük kaydı yapar. Ancak, kodda gösterilenlere ek olarak iletişimin birçok yönünü de günlüğe kaydedebilirsiniz.

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

Sonuç:

İşte benim durumumdaki sonuç. Sunucunun HTTP 200 döndürdüğünü unutmayın. Bu, HTTP istek yanıtı için standart başarı kodudur.

(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_requestYükleme sırasında başarısız olacağını söylemeye değer olabilir , bu nedenle suds-jurkofork kullanıyorsanız , suds_requestjurko'nun suds sürümüyle çalışmak üzere uyarlanmış olanı kurabilirsiniz:pip install git+https://github.com/chrcoe/suds_requests.git@feature/python3_suds_jurko
errata

7

Şu anda (2008 itibariyle), Python için mevcut olan tüm SOAP kitaplıkları emiyor. Mümkünse SOAP'tan kaçınmanızı tavsiye ederim. En son Python'dan bir SOAP web servisini kullanmaya zorlandığımızda, C #'da SOAP'u bir tarafta işleyen ve diğer tarafta COM'u konuşan bir sarmalayıcı yazdık.


15
Bu, xml ve http tabanlı basit bir protokol kullanmanın delicesine karmaşık bir yolu gibi görünüyor.
ddaa

1
2008 yılında ihtiyaçlarımızı en az emen yöntem buydu. O belirli web hizmetinin, tüm python kitaplıklarının yanlış anladığı bir konuda son derece seçici olduğunu hatırlıyorum.
Matthew Scouten

1
2019, python zeep, suds, birçok ayrıştırma uyumsuzluk sorununa hala yatkın. Yetersiz korunan wsdl belgeleri, bu modüllerin kesintisiz fişek gibi istisna atmasına neden olur.
mootmoot


6

Periyodik olarak buna tatmin edici bir cevap aradım, ancak şu ana kadar şansım yok. SoapUI + istekleri + el emeği kullanıyorum.

Bunu yapmak için en son ihtiyacım olduğunda vazgeçtim ve Java'yı kullandım ve bunu en son yapmak istediğimde birkaç kez vazgeçtim , ama gerekli değildi.

Talepler kitaplığını geçen yıl Project Place'in RESTful API'si ile başarıyla kullandıktan sonra, belki de göndermek istediğim SOAP isteklerini benzer şekilde elden geçirebileceğimi fark ettim.

Çıkıyor çok zor değil, ama olduğu alanlar tutarsız Şu anda bugün üzerinde çalışıyorum bir 'jobId', JobId' ve 'JobID' vardır (adlandırılır, özellikle hata zaman alıcı ve eğilimli. Ben yüke SoapUI kullanmak WSDL, uç noktaların çıkarılmasını vb. kolaylaştırmak ve bazı manuel testler yapmak için ... Şimdiye kadar, kullandığım herhangi bir WSDL'deki değişikliklerden etkilenmediğim için şanslıydım.


3

SOAPpy'nin Python 2.5 ile çalışmadığı doğru değil - çok basit ve gerçekten çok basit olmasına rağmen çalışıyor. Daha karmaşık bir web servisiyle konuşmak istiyorsanız, ZSI sizin tek arkadaşınızdır.

Bulduğum gerçekten faydalı demo http://www.ebi.ac.uk/Tools/webservices/tutorials/python adresinde - bu ZSI'nin nasıl çalıştığını anlamama gerçekten yardımcı oldu.


1
python setup.py install, en son sürümde hatalar veriyor. En son geliştirici kopyası işe yarayabilir, ancak bu yapılması gereken bir acı.
davidmytton


1

SOAPpy artık kullanılmıyor, AFAIK, ZSL ile değiştirildi. Bu tartışmalı bir nokta çünkü Python 2.5 veya Python 2.6'da hiçbirini çalıştıramıyorum, çok daha az derleyemiyorum


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']))


örnek çıktı: ... DEBUG: pysimplesoap.helpers: complexContent / simpleType / element string = string [u'StockQuote '] GetQuote: <StockQuotes><Stock><Symbol>GOOG</Symbol> <Last> 816.13 </Last> <Tarih> 2017/03/23 </ date> <time> 11:41 </ Saat> <değiştir> -13.46 </ Değişim> <> aç 820,01 </ aç> <Yüksek> 822,57 </ Yüksek> <Düşük> 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>
Aşağı Akış

pysimplesoap / client.py'de Python3'te başarısız: 757 - 'dict' nesnesinin '
iteritems

Görünüşe göre PIP ile gelen sürüm bozuk.
GIT'den

İyi nokta: şu bağlantıya bakın: stackoverflow.com/questions/13998492/iteritems-in-python "dict.iteritems kaldırıldı çünkü dict.items artık dict.iteritems'in python 2'de yaptığı şeyi yapıyor ..."
Down the Stream
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.