【问题标题】:SOAP requests with multiple namespaces具有多个命名空间的 SOAP 请求
【发布时间】:2013-06-03 00:27:01
【问题描述】:

我正在实现一些使用多个命名空间的预定义 WSDL。为简单起见,我的请求类似于:

<?xml version='1.0' encoding='UTF-8'?>
<soapenv:Envelope xmlns:soapenv="schemas.xmlsoap.org/soap/envelope/">
  <soapenv:Header>
  </soapenv:Header>                                                                                                                                                      
  <soapenv:Body>
<a:Foo xmlns:a="www.example.com/schema/a" AttrA="a1" AttrB="b2">
    <b:Baz xmlns:b="www.example.com/schema/b" AttrC="c3"/>
  <a:Bar>blah</a:Bar>
</a:Foo>
  </soapenv:Body>
</soapenv:Envelope>

我一直在使用如下代码:

from spyne.model.primitive import Unicode
from spyne.model.complex import Iterable, XmlAttribute, ComplexModel, ComplexModelMeta, ComplexModelBase
from spyne.service import ServiceBase
from spyne.protocol.soap import Soap11
from spyne.application import Application
from spyne.decorator import srpc, rpc

class BazBase(ComplexModelBase):
    __namespace__ = "www.example.com/schema/b"
    __metaclass__ = ComplexModelMeta

class Baz(BazBase):
    Thing = Unicode
    AttrC = XmlAttribute(Unicode)

class FooService(ServiceBase):
    __namespace__ = "www.example.com/schema/a"

    @rpc(XmlAttribute(Unicode), XmlAttribute(Unicode), Baz, Unicode, _returns=Iterable(Unicode))
    def Foo(ctx, AttrA, AttrB, Baz, Bar):
        yield 'Hello, %s' % Bar 

app = Application([FooService],                                                                                                                                          
    "www.example.com/schema/a",
    in_protocol=Soap11(validator='lxml'),
    out_protocol=Soap11(),
)

解析东西,但我得到:

<?xml version='1.0' encoding='utf-8'?>
<senv:Envelope xmlns:senv="schemas.xmlsoap.org/soap/envelope/">
  <senv:Body>
    <senv:Fault>
      <faultcode>senv:Client.SchemaValidationError</faultcode>
      <faultstring>
      &lt;string&gt;:1:0:ERROR:SCHEMASV:SCHEMAV_ELEMENT_CONTENT:
      Element '{www.example.com/schema/b}Baz': This element
      is not expected. Expected is one of (
      {www.example.com/schema/a}Baz,
      {www.example.com/schema/a}Bar ).</faultstring>
      <faultactor></faultactor>
    </senv:Fault>
  </senv:Body>
</senv:Envelope>

作为响应。

我尝试使用 schema_tag 参数,但我在其中输入的任何内容似乎都不起作用,出现诸如“ValueError: Unhandled schema_tag / type combination”之类的错误。或 'ValueError: InvalidTagName'

如何正确处理同一请求文档中的多个命名空间?

【问题讨论】:

    标签: python soap spyne


    【解决方案1】:

    据我所知,Spyne 在那里做了正确的事情,但请求不正确。子元素始终位于父元素的命名空间下。这些元素的子元素可以在自己的命名空间中。

    <a:Foo xmlns:a="www.example.com/schema/a" AttrA="a1" AttrB="b2">
        <a:Baz xmlns:b="www.example.com/schema/b" AttrC="c3"/>
        <a:Bar>blah</a:Bar>
    </a:Foo>
    

    也就是说,您可以只使用不关心命名空间的软验证器。

    【讨论】:

      猜你喜欢
      • 2011-08-25
      • 2011-03-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-04
      • 2018-04-19
      相关资源
      最近更新 更多