我有以下SOAP请求,我应该能够处理:
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Body>
<LogoutNotification xmlns="urn:mace:shibboleth:2.0:sp:notify" type="global">
<SessionID>
_d5628602323819f716fcee04103ad5ef
</SessionID>
</LogoutNotification>
</s:Body>
</s:Envelope>
SessionID只是RPC参数。这很容易处理。
但是如何在spyne中建模type
属性? type
要么是&#34;全球&#34;或者&#34;本地&#34;。
我目前有以下内容(并且禁用了验证以便能够忽略该属性):
class LogoutNotificationService(Service):
@rpc(MandatoryUnicode, _returns=OKType,
_in_variable_names={'sessionid': 'SessionID'},
_out_variable_name='OK',
)
def LogoutNotification(ctx, sessionid):
pass # handle the request
为了完整起见,这里使用的是模型:
class OKType(ComplexModel):
pass
class MandatoryUnicode(Unicode):
class Attributes(Unicode.Attributes):
nullable = False
min_occurs = 1
架构为online。但是没有包含该属性的官方WSDL。
答案 0 :(得分:0)
关键是使用bare
体型。然后,您可以(并且需要)对完整的输入和输出消息进行建模。
我的工作代码如下:
class OKType(ComplexModel):
pass
class MandatoryUnicode(Unicode):
class Attributes(Unicode.Attributes):
nullable = False
min_occurs = 1
class LogoutRequest(ComplexModel):
__namespace__ = 'urn:mace:shibboleth:2.0:sp:notify'
SessionID = MandatoryUnicode
type = XmlAttribute(Enum("global", "local", type_name="LogoutNotificationType"))
class LogoutResponse(ComplexModel):
__namespace__ = 'urn:mace:shibboleth:2.0:sp:notify'
OK = OKType
class LogoutNotificationService(Service):
@rpc(LogoutRequest, _returns=LogoutResponse, _body_style='bare')
def LogoutNotification(ctx, req):
# do stuff, raise Fault on error
# sessionid is available as req.SessionID
return LogoutResponse
关于not wrapping response的(不是真正相关的问题)包含了很好的例子,并向我展示了如何解决这个问题。