suds을 사용하여 액세스하려는 비누 1.1/1.2 웹 서비스가 있습니다.비누를 사용하여 응답 비누 헤더에 액세스
불행히도 서비스는 응답 토큰에 인증 토큰을 넣습니다.
어떻게 든 헤더에 액세스 할 수 있습니까?
요청에 맞춤 비누 헤더를 설정할 수 있다는 것을 알고 있지만 그게 내가 원하는 것이 아닙니다.
suds을 사용하여 액세스하려는 비누 1.1/1.2 웹 서비스가 있습니다.비누를 사용하여 응답 비누 헤더에 액세스
불행히도 서비스는 응답 토큰에 인증 토큰을 넣습니다.
어떻게 든 헤더에 액세스 할 수 있습니까?
요청에 맞춤 비누 헤더를 설정할 수 있다는 것을 알고 있지만 그게 내가 원하는 것이 아닙니다.
당신은 위의 비누 헤더 필드의 resultCode를 읽고
print client.last_received().getChild("soap:Envelope").getChild("soap:Header")
.getChild("ResponseHeader").getChild("resultCode").getText()
과 같은 작업을 수행 할 수 있습니다. 각 필드마다이 작업을 수행해야합니다. 이것은 내가 아는 한 헤더를 읽는 뒷문이었습니다. 자세한 내용은
내가 (여전히 유지) 비눗물-jurko 분기를 사용하고 soap headers with suds
에서보고, 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>)
당신은 시간 낭비자를 구해 주셨습니다. 고마워! –
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이 같은 딕셔너리를 반환을 이걸로.
건배! 나는 더 깨끗한 방법이 될 것이라고 생각한다 :'client.last_received(). getChildAtPath ("soap : Envelope/soap : Header/ResponseHeader/resultCode") .getText()', 그러나 여전히 다루기 힘들다. – soulcheck
예, 동의했습니다. 전에 ..AtPath를 사용하지 않았습니다. 청소하십시오 – fayyazkl