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

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 클라이언트에서 잘 작동합니다.



답변

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

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


답변

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

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


답변

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

필요한 기본 구성 코드 블록

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

  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
      },
 })


답변

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


답변

Zeep은 여러분이 요구하는 것과 일치하는 Python 용 적절한 SOAP 라이브러리입니다 : http://docs.python-zeep.org


답변

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

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

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

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


답변

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

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