programing

파이썬에서 WSDL(SOAP) 웹 서비스를 사용하려면 어떻게 해야 합니까?

cafebook 2023. 8. 11. 22:35
반응형

파이썬에서 WSDL(SOAP) 웹 서비스를 사용하려면 어떻게 해야 합니까?

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

저는 부분적으로는 효과가 있지만 특정 유형(sud)으로 부서지는 sud를 사용해 보았습니다.찾을 수 없는 유형:'항목') 유형을 찾을 수 없습니다.

클라이언트도 살펴보았지만 WSDL을 지원하지 않는 것 같습니다.

그리고 ZSI를 살펴보았지만 매우 복잡해 보입니다.그것에 대한 샘플 코드를 가지고 있는 사람이 있습니까?

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

는 당신이 SUDS를 보는 것을 추천합니다.

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

비교적 새로운 도서관이 있는데, 매우 유망하고, 아직 문서화되지 않았지만, 매우 깨끗하고, 피톤적인 것처럼 보입니다: 비단뱀 지프입니다.

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

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

기본 구성 요소 코드 블록 필요

다음은 클라이언트 응용프로그램에 필요한 기본 코드 블록입니다.

  1. 세션 요청 섹션: 공급자와의 세션 요청
  2. 세션 인증 섹션: 공급자에게 자격 증명 제공
  3. 클라이언트 섹션: 클라이언트 만들기
  4. 보안 헤더 섹션: 클라이언트에 WS-보안 헤더 추가
  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-보안 헤더 추가:

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

지프는 당신이 요청하는 것과 일치하는 파이썬용 괜찮은 SOAP 라이브러리입니다: http://docs.python-zeep.org

현재(2008년 기준) Python에 사용할 수 있는 모든 SOAP 라이브러리는 형편없습니다.가능하면 SOAP는 피하는 것이 좋습니다.마지막으로 Python에서 SOAP 웹 서비스를 사용해야 할 때, 우리는 한쪽에서 SOAP를 처리하고 다른 쪽에서는 COM을 말하는 C#로 래퍼를 작성했습니다.

저는 이것에 대한 만족스러운 답을 주기적으로 찾지만, 아직까지는 운이 없습니다.나는 비누를 사용합니다.UI + 요청 + 수동 작업.

저는 이것을 하기 위해 마지막으로 필요할 때 포기하고 자바를 사용했고, 마지막으로 이것을 하고 싶었을 때 몇 번 포기했지만, 그것은 필수적이지 않았습니다.

작년에 Project Place의 RESTful API를 사용하여 요청 라이브러리를 성공적으로 사용한 후, 저는 제가 보내고 싶은 SOAP 요청을 비슷한 방식으로 수동으로 처리할 수도 있다는 생각이 들었습니다.

그렇게 어렵지는 않지만, 특히 필드의 이름이 일치하지 않을 경우 시간이 많이 걸리고 오류가 발생하기 쉽습니다(현재 작업 중인 필드의 이름이 'jobId', JobId 및 'JobId'임).'아이디'. 비누를 사용합니다.WSDL을 로드하여 엔드포인트 등을 쉽게 추출하고 몇 가지 수동 테스트를 수행할 수 있도록 합니다.지금까지 저는 제가 사용하고 있는 WSDL의 변경 사항에 영향을 받지 않은 것이 행운이었습니다.

SOAPpy가 Python 2.5에서 작동하지 않는다는 것은 사실이 아닙니다. 매우 간단하고 정말로, 정말로 기본적이지만 작동합니다.만약 당신이 더 복잡한 웹 서비스와 이야기하고 싶다면, ZSI가 당신의 유일한 친구입니다.

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

독자적인 제품을 구우신다면 http://effbot.org/zone/element-soap.htm 을 보는 것을 강력히 추천합니다.

SOAPpy는 이제 더 이상 사용되지 않습니다. AFAIK는 ZSL로 대체되었습니다.Python 2.5 또는 Python 2.6에서 컴파일은커녕 둘 다 작동할 수 없기 때문에 곤란한 점입니다.

#!/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']))

언급URL : https://stackoverflow.com/questions/115316/how-can-i-consume-a-wsdl-soap-web-service-in-python

반응형