나는 최근에 같은 문제를 발견했습니다. 내 솔루션의 개요는 다음과 같습니다.
필요한 기본 구성 코드 블록
다음은 클라이언트 애플리케이션의 필수 기본 코드 블록입니다.
- 세션 요청 섹션 : 제공자에게 세션 요청
- 세션 인증 섹션 : 공급자에게 자격 증명 제공
- 클라이언트 섹션 : 클라이언트 생성
- 보안 헤더 섹션 : 클라이언트에 WS-Security 헤더 추가
- 소비 섹션 : 필요에 따라 사용 가능한 작업 (또는 방법)을 소비합니다.
어떤 모듈이 필요합니까?
많은 사람들이 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
},
})