Python에서 WSDL (SOAP) 웹 서비스를 어떻게 사용할 수 있습니까?


124

Python에서 WSDL SOAP 기반 웹 서비스를 사용하고 싶습니다. Dive Into Python 코드를 살펴 보았지만 SOAPpy 모듈은 Python 2.5에서 작동하지 않습니다.

부분적으로 작동 하는 suds 를 사용해 보았지만 특정 유형 (suds.TypeNotFound : 유형을 찾을 수 없음 : '항목')으로 중단됩니다.

나는 또한 Client를 보았지만 이것은 WSDL을 지원하지 않는 것 같습니다.

ZSI를 살펴 봤지만 매우 복잡해 보입니다. 누구든지 그것에 대한 샘플 코드가 있습니까?

WSDL은 https://ws.pingdom.com/soap/PingdomAPI.wsdl 이며 PHP 5 SOAP 클라이언트에서 잘 작동합니다.


3
수락 된 답변을 변경 하시겠습니까? 현재 허용되는 대답은 -1이고 +19가있는 또 다른 대답이 있습니다. 나는 이것이 2008 년의 것임을 압니다. 나는 단지 제안하고있다.
Mark E. Haase

SUDS는 WSDL을 제대로 구문 분석 할 수 없기 때문에 작동하지 않았지만 그렇지 않으면 좋은 선택이 될 것입니다. 그래서 몇 가지 대안이있는 Dive Into Python에서 튜토리얼에 대한 답변을 변경했습니다. 참고로 Pingdom은 이제 blog.pingdom.com/2011/04/11/pingdom-rest-api-wrappers
davidmytton

답변:


49

SUDS를 살펴 보는 것이 좋습니다.

"Suds는 웹 서비스를 사용하기위한 경량 SOAP Python 클라이언트입니다."


두 번째. Suds는 클래스 생성없이 즉시 이해가되었으며 WSDL을 라이브로로드하고 즉시 사용할 수있는 객체를 생성합니다.
EnigmaCurry

19
재귀 가져 오기로 WSDL을 열 때 Suds에 무한 재귀 문제가 있습니다. 이것은 Suds의 차단 버그로 간주되며이 문제는 3 년 전에 생성되었지만 아직 수정되지 않았습니다. fedorahosted.org/suds/ticket/239 Suds 가 2012 년에 사용하기에 적합한 지 궁금합니다.
Buttons840

2
비눗물 은 죽은 것 같습니다. Long live SUDS- 이것은 활성 포크 인 것 같습니다.
nerdoc

3
이것이 가장 좋은 답변이지만 오늘날 작동하는 답변을 찾는 사람이 있다면 최신 답변에서 알 수 있듯이 Zeep을 고려 하십시오 .
Tobias Feil

25

매우 유망하고 아직 문서화가 부족하지만 매우 깨끗하고 비단 해 보이는 비교적 새로운 라이브러리가 있습니다 : python zeep .

예제 는 이 답변 을 참조하십시오 .


2
이것에 대해 +1. 오늘 지프를 사용 해봤는데 놀라 울 정도로 사용하기 쉬웠습니다. 3 줄의 코드로 Soap 1.1 / 1.2 서비스를 소비하고 호출 할 수있었습니다.
Jagu

20

나는 최근에 같은 문제를 발견했습니다. 내 솔루션의 개요는 다음과 같습니다.

필요한 기본 구성 코드 블록

다음은 클라이언트 애플리케이션의 필수 기본 코드 블록입니다.

  1. 세션 요청 섹션 : 제공자에게 세션 요청
  2. 세션 인증 섹션 : 공급자에게 자격 증명 제공
  3. 클라이언트 섹션 : 클라이언트 생성
  4. 보안 헤더 섹션 : 클라이언트에 WS-Security 헤더 추가
  5. 소비 섹션 : 필요에 따라 사용 가능한 작업 (또는 방법)을 소비합니다.

어떤 모듈이 필요합니까?

많은 사람들이 urllib2와 같은 Python 모듈을 사용하도록 제안했습니다. 그러나 적어도이 특정 프로젝트에서는 작동하는 모듈이 없습니다.

따라서 여기에 필요한 모듈 목록이 있습니다. 먼저 다음 링크에서 최신 버전의 sud를 다운로드하여 설치해야합니다.

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)

로깅 :

이와 같은 구현의 모범 사례 중 하나는 통신이 실행되는 방식을 확인하기 위해 로깅하는 것입니다. 문제가있는 경우 디버깅이 용이합니다. 다음 코드는 기본 로깅을 수행합니다. 그러나 코드에 설명 된 사항 외에도 통신의 여러 측면을 기록 할 수 있습니다.

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 년 현재), 파이썬에서 사용할 수있는 모든 SOAP 라이브러리는 엉망입니다. 가능하면 SOAP를 피하는 것이 좋습니다. 마지막으로 Python의 SOAP 웹 서비스를 사용하도록 강요했을 때 한 쪽에서는 SOAP를 처리하고 다른 쪽에서는 COM을 말하는 C # 래퍼를 작성했습니다.


15
그것은 xml과 http를 기반으로 한 간단한 프로토콜을 사용하는 엄청나게 복잡한 방법처럼 들립니다.
ddaa

1
2008 년 당시 이것은 우리의 필요를 가장 적게 빨아 들인 방법이었습니다. 나는 특정 웹 서비스가 모든 파이썬 라이브러리가 잘못되고있는 것에 대해 매우 까다 롭다는 것을 기억하는 것 같습니다.
Matthew Scouten

1
2019, python zeep, suds는 여전히 많은 구문 분석 비 호환성 문제가 발생하기 쉽습니다. wsdl 문서를 잘못 유지하면 해당 모듈이 논스톱 폭죽처럼 예외를 발생시킵니다.
mootmoot


6

나는 이것에 대한 만족스러운 대답을 주기적으로 검색하지만 지금까지는 운이 없습니다. 나는 soapUI + 요청 + 육체 노동을 사용합니다.

나는 포기하고 자바에게 내가 마지막으로 사용 필요한 이 작업을 수행하기를, 단순히 몇 번에게 내가 마지막으로 포기 이 작업을 수행하기를, 그러나 그것은 중요하지 않았다.

작년에 Project Place의 RESTful API와 함께 요청 라이브러리를 성공적으로 사용한 결과, 비슷한 방식으로 보내려는 SOAP 요청을 직접 롤링 할 수 있다는 생각이 들었습니다.

밝혀 너무 어렵지 않다, 그러나 입니다 필드가 일관성 나는 현재 오늘 일하고 있어요 하나가 '작업 ID'작업 ID '와'작업 ID를 '이 (이름이 지정됩니다 특히, 오류 시간과 경향. 나는 부하에 soapUI를 사용 WSDL을 사용하면 엔드 포인트 등을 쉽게 추출하고 수동 테스트를 수행 할 수 있습니다. 지금까지 사용중인 WSDL의 변경 사항에 영향을받지 않은 것은 운이 좋았습니다.


3

SOAPpy가 Python 2.5에서 작동하지 않는다는 것은 사실이 아닙니다. 작동하지만 매우 간단하고 실제로는 기본입니다. 더 복잡한 웹 서비스와 대화하고 싶다면 ZSI가 유일한 친구입니다.

내가 찾은 정말 유용한 데모는 http://www.ebi.ac.uk/Tools/webservices/tutorials/python에 있습니다 . 이것은 ZSI가 어떻게 작동하는지 이해하는 데 정말 도움이되었습니다.


1
python setup.py install은 최신 릴리스에서 오류를 제공합니다. 최신 개발 사본이 작동 할 수도 있지만 그렇게하는 것은 고통 스럽습니다.
davidmytton


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

lib 목록은 다음과 같습니다. code.google.com/archive/p/pysimplesoap
Down the Stream

샘플 출력 : ... DEBUG : pysimplesoap.helpers : complexContent / simpleType / element string = string [u'StockQuote '] GetQuote : <StockQuotes> <Stock> <Symbol> GOOG </ Symbol> <Last> 816.13 </ Last> <Date> 2017 년 3 월 23 일 </ 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>
Down the Stream

pysimplesoap / client.py : 757의 Python3에서 실패- 'dict'객체에 '
iteritems

분명히 PIP와 함께 제공되는 버전이 손상되었습니다. GIT에서 수동으로 설치해야합니다 -이 일을 해결
ierdna

좋은 점 :이 링크를 참조하십시오 : stackoverflow.com/questions/13998492/iteritems-in-python "dict.items가 이제 dict.iteritems가 파이썬 2에서했던 일을 수행하기 때문에 제거되었습니다 ..."
Down the Stream
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.