gpt4 book ai didi

python - Spyne:输入参数具有不同命名空间的请求

转载 作者:行者123 更新时间:2023-11-30 22:41:22 27 4
gpt4 key购买 nike

我发现了这个问题:https://mail.python.org/pipermail/soap/2013-June/001120.html我有同样的问题,找不到答案。请帮忙。

我正在在spyne中实现一些现有的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>

当我发送此请求时,我收到以下信息:

<?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>
<string>: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>

我一直在查看文档和设置选项,到目前为止没有什么能让我度过这个坎坷。目前这是否可能 spy ?我需要做更多的事情并解析 in_document 吗?任何输入都是非常感谢。

有关我一直在弄乱的代码的更多详细信息:

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(),
)

谢谢!

最佳答案

所以,它的工作原理如下:

from spyne import Unicode, Iterable, XmlAttribute, ComplexModel, \
ServiceBase, Application, rpc
from spyne.protocol.soap import Soap11


NS_B = "www.example.com/schema/b"


class Baz(ComplexModel):
__namespace__ = NS_B

Thing = Unicode
AttrC = XmlAttribute(Unicode)


class FooCustomRequest(ComplexModel):
AttrA = XmlAttribute(Unicode)
AttrB = XmlAttribute(Unicode)
Bar = Baz.customize(sub_ns=NS_B)
Baz = Unicode


class FooService(ServiceBase):
@rpc(FooCustomRequest, _returns = Iterable(Unicode),
_body_style='bare')
def Foo(ctx, req):
AttrA, AttrB, Baz, Bar = \
req.AttrA, req.AttrB, req.Baz, req.Bar
yield 'Hello, %s' % Bar


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

但事实并非如此。这会生成以下对象定义:

<xs:complexType name="FooCustomRequest">
<xs:sequence>
<xs:element name="Bar" type="s0:Baz" minOccurs="0" nillable="true"/>
<xs:element name="Baz" type="xs:string" minOccurs="0"
nillable="true"/>
</xs:sequence>
<xs:attribute name="AttrA" type="xs:string"/>
<xs:attribute name="AttrB" type="xs:string"/>
</xs:complexType>

如您所见,sub_ns Spyne 的模式生成器会忽略我们上面所做的声明。<附录>我的 Xml 已经生锈了,但经过进一步研究,这似乎是设计造成的 - 作为 xs:element 的名称属性不能有 namespace 前缀(即它是 NCName ),因此无法使用 Xml 架构技术和 friend 对客户端发送给您的文档类型进行建模。如果您无法说服客户发送“正确”的请求,此时最好的选择是软验证。

所以validator='lxml'永远不会接受您的文件。然而,validator='soft'将会,您可以使用它,直到 Spyne 中修复此错误为止。

我可以确认以下请求有效:

<SOAP-ENV:Envelope xmlns:b="www.example.com/schema/b"
xmlns:a="www.example.com/schema/a"
xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Header/>
<soapenv:Body>
<a:Foo AttrA="attr-a">
<b:Bar AttrC="attr-c">
<b:Thing>thing</b:Thing>
</b:Bar>
<a:Baz>baz</a:Baz>
</a:Foo>
</soapenv:Body>
</SOAP-ENV:Envelope>

如果您可以通过 https://github.com/arskom/spyne 提交问题有了需要生成的 XSD 片段,我可以修复它。

<附录2>
我确信模式只能定义其 targetNamespace 中的元素。通过使用 <element ref="b:Baz" /> 应该可以从另一个命名空间获得复杂类型的直接子代。但这只不过是一个理论。同样,如果您知道需要生成哪种模式文档,请提出问题。否则,软验证的解决方法是您目前最好的选择。

关于python - Spyne:输入参数具有不同命名空间的请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42586790/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com