2012-12-12 6 views
2

suds을 사용하여 액세스하려는 비누 1.1/1.2 웹 서비스가 있습니다.비누를 사용하여 응답 비누 헤더에 액세스

불행히도 서비스는 응답 토큰에 인증 토큰을 넣습니다.

어떻게 든 헤더에 액세스 할 수 있습니까?

요청에 맞춤 비누 헤더를 설정할 수 있다는 것을 알고 있지만 그게 내가 원하는 것이 아닙니다.

답변

2

당신은 위의 비누 헤더 필드의 resultCode를 읽고

print client.last_received().getChild("soap:Envelope").getChild("soap:Header") 
.getChild("ResponseHeader").getChild("resultCode").getText() 

과 같은 작업을 수행 할 수 있습니다. 각 필드마다이 작업을 수행해야합니다. 이것은 내가 아는 한 헤더를 읽는 뒷문이었습니다. 자세한 내용은

내가 (여전히 유지) 비눗물-jurko 분기를 사용하고 soap headers with suds

+0

건배! 나는 더 깨끗한 방법이 될 것이라고 생각한다 :'client.last_received(). getChildAtPath ("soap : Envelope/soap : Header/ResponseHeader/resultCode") .getText()', 그러나 여전히 다루기 힘들다. – soulcheck

+0

예, 동의했습니다. 전에 ..AtPath를 사용하지 않았습니다. 청소하십시오 – fayyazkl

4

에서보고, client.last_received() 그것이 갈래 된 초 후 제거 되었기 때문에 곤경에 달렸다. 그래서 헤더에 액세스하는 다른 방법을 찾아야했습니다.

다행히도 메시지 플러그인을 사용하여 구문 분석 된 문서를 저장 한 다음 나중에 플러그인을 통해 헤더에 액세스 할 수 있습니다. 편의상, xml 문서의 원시 값으로 작업하는 대신 올바르게 입력/구조화 된 값을 얻기 위해 service-method를 기반으로 헤더를 처리 할 수 ​​있습니다.

from suds.plugin import MessagePlugin 

class HeaderPlugin(MessagePlugin): 
    def __init__(self): 
     self.document = None 

    def parsed(self, context): 
     self.document = context.reply 

    def get_headers(self, method): 
     method = method.method 
     binding = method.binding.output 
     rtypes = binding.headpart_types(method, False) 

     envns = ('SOAP-ENV', 'http://schemas.xmlsoap.org/soap/envelope/') 
     soapenv = self.document.getChild('Envelope', envns) 
     soapheaders = soapenv.getChild('Header', envns) 
     nodes = soapheaders.children 
     if len(nodes): 
      resolved = rtypes[0].resolve(nobuiltin=True) 
      return binding.unmarshaller().process(nodes[0], resolved) 
     return None 

사용 :

from suds.client import Client 

hp = HeaderPlugin() 
client = Client(wsdl, plugins=[hp]) 

response = client.service.LoremIpsum() 
headers = hp.get_headers(client.service.LoremIpsum) 

예 출력 :

>>> headers 
(AuthenticationResponseHeader){ 
    sessionKey = "a631cd00-c6be-416f-9bd3-dbcd322e0848" 
    validUntil = 2030-01-01 01:01:01.123456+01:00 
} 
>>> headers.validUntil 
datetime.datetime(2030, 1, 1, 1, 1, 1, 123456, tzinfo=<suds.sax.date.FixedOffsetTimezone object at 0x7f7347856be0>) 
+0

당신은 시간 낭비자를 구해 주셨습니다. 고마워! –

0

Towr의 클래스 플러그인이 잘 작동하지만, 당신이 SOAPHeader에 응답에서 두 개 이상의 OBJ를 할 때 문제가 있습니다. 그의 코드는 첫 번째 객체 만 가져옵니다.

class HeaderPlugin(MessagePlugin): 
    def __init__(self): 
     self.document = None 

    def parsed(self, context): 
     self.document = context.reply 

    def get_headers(self, method): 
     Result = {} 
     method = method.method 
     binding = method.binding.output 
     SHeaderElem = binding.headpart_types(method, False) 

     envns = ('SOAP-ENV', 'http://schemas.xmlsoap.org/soap/envelope/') 
     soapenv = self.document.getChild('Envelope', envns) 
     soapheaders = soapenv.getChild('Header', envns) 
     SHeaderNodes = soapheaders.children 

     for Elem in SHeaderElem: 
      for Node in SHeaderNodes: 
       if(Node.name == Elem.name): 
        ElemRes = Elem.resolve(nobuiltin=True) 
        NodeRes = binding.unmarshaller().process(Node, ElemRes) 
        Result[Elem.name] = NodeRes 
     return Result 
    # 

이 더 잘 이해의 예를 보려면 : 여기

는 Towr의 클래스 개선에 대한 코드입니다. 이 비누 응답받을 경우 :

SoapHeadersResp = {'MessageHeader':MessageHeaderObj, 'Security':SecurityObj} 

은 Towr 말했다 같은 단계에 따라이 클래스를 사용하려면 자신의 HeaderPlugin 클래스를 대체 :

<soap-env:Envelope xmlns:eb="http://www.ebxml.org/namespaces/messageHeader" xmlns:soap-env="http://schemas.xmlsoap.org/soap/envelope/" xmlns:wsse="http://schemas.xmlsoap.org/ws/2002/12/secext"> 
    <soap-env:Header> 
     <eb:MessageHeader eb:version="1.0" soap-env:mustUnderstand="1"> 
      <!-- --> 
     </eb:MessageHeader> 
     <wsse:Security> 
      <!-- --> 
     </wsse:Security> 
    </soap-env:Header> 
    <soap-env:Body> 
     <!-- --> 
    </soap-env:Body> 
</soap-env:Envelope> 

함수 get_headers이 같은 딕셔너리를 반환을 이걸로.

관련 문제