如何在spyne中建模SOAP远程过程属性?

时间:2017-10-14 16:44:37

标签: python soap spyne

我有以下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。

1 个答案:

答案 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的(不是真正相关的问题)包含了很好的例子,并向我展示了如何解决这个问题。