【问题标题】:How do I keep Spyne from wrapping my response?如何防止 Spyne 包装我的回复?
【发布时间】:2013-10-23 08:13:33
【问题描述】:

这里是示例服务

NS = 'my_app_namespace'

class MyMethodRS(ComplexModel):
    __tns__ = NS
    Version = XmlAttribute(Unicode)

class MyService(ServiceBase):
    __tns__ = NS

    @srpc(Unicode, _returns=MyMethodRS, _out_variable_name='MyMethodRS')
    def my_method(foo):
        response = MyMethodRS()
        response.Version = '1.0'
        return response

# and then application will be created and starged as wsgi app

然后我发布请求

<?xml version='1.0' encoding='UTF-8' ?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> 
  <soap:Body xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
    <my_method xmlns="my_app_namespace">
      <foo>bar</foo>
    <my_method>
  </soap:Body>
</soap:Envelope>

我得到了

<?xml version='1.0' encoding='UTF-8' ?>
<senv:Envelope>
  <senv:Body>
    <tns:my_methodResponse>
      <tns:MyMethodRS Version="1.0" />
    </tns:my_methodResponse>
  </senv:Body>
</senv:Envelope>

我不希望将响应包装到 my_methodResponse 中。我尝试将_body_style='bare' 添加到@srpc 并失败了

<?xml version='1.0' encoding='UTF-8' ?>
<senv:Envelope>
  <senv:Body>
    <senv:Fault>
      <faultcode>senv:Client.SchemaValidationError</faultcode>
      <faultstring><string>:14:0:ERROR:SCHEMASV:SCHEMAV_CVC_TYPE_3_1_2: Element '{http://www.opentravel.org/OTA/2003/05}my_method': Element content is not allowed, because the type definition is simple.</faultstring>
      <faultactor />
    </senv:Fault>
  </senv:Body>
</senv:Envelope>

我应该如何处理它?我正在尝试实现严格的 API,并且无法在我的响应中添加任何包装器。

【问题讨论】:

    标签: python xml soap spyne


    【解决方案1】:

    从这个请求来看:

    <my_method xmlns="my_app_namespace">
      <foo>bar</foo>
    <my_method>
    

    你需要这个:

    class MyMethodRequest(ComplexModel):
        foo = Unicode
    
    class MyService(ServiceBase):
        @srpc(MyMethodRequest, _returns=MyMethodRS, _body_style='bare' 
                               _out_variable_name='MyMethodRS')
        def my_method(request):
            foo = request.foo
            response = MyMethodRS()
            response.Version = '1.0'
            return response
    

    这与非裸模式的实际作用非常接近。

    【讨论】:

    • 非常感谢! bare 定义对我来说似乎更清晰,因为它具有不同的请求模型描述。
    • 无论你的船漂浮什么 :)
    • 这里的问题是_body_style='bare' 只接受一个参数。对于某些客户端,它有时会在 wsdl 验证中失败。有没有其他办法?
    • 在裸模式下,没有其他参数的空间。如果该函数需要更多数据,则需要进入该参数。
    • 关于 WSDL 故障,请在 github repo 提出问题,以便我查看
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-13
    • 2019-09-03
    • 2010-09-20
    • 2018-05-13
    • 2019-04-24
    相关资源
    最近更新 更多