gpt4 book ai didi

python 在 SOAP 请求中产生错误的命名空间前缀

转载 作者:太空狗 更新时间:2023-10-30 00:41:36 25 4
gpt4 key购买 nike

我使用 python/suds 来实现客户端,但我在发送的 SOAP header 中收到错误的命名空间前缀,用于 element ref= 定义的特定类型的参数在 wsdl 中。

.wsdl 引用数据类型 .xsd 文件,请参见下文。问题出在函数 GetRecordAttributes 上及其类型的第一个参数 gbt:recordReferences .

文件:browse2.wsdl

<xsd:schema targetNamespace="http://www.grantadesign.com/10/10/Browse" xmlns="http://www.grantadesign.com/10/10/Browse" xmlns:gbt="http://www.grantadesign.com/10/10/GrantaBaseTypes" elementFormDefault="qualified" attributeFormDefault="qualified">
<xsd:import schemaLocation="grantabasetypes2.xsd" namespace="http://www.grantadesign.com/10/10/GrantaBaseTypes"/>
<xsd:element name="GetRecordAttributes">
<xsd:complexType>
<xsd:sequence>
<xsd:element ref="gbt:recordReferences">
</xsd:element>

引用文件:grantabasetypes2.xsd

<element name="recordReferences">
<complexType>
<sequence>
<element name="record" minOccurs="0" maxOccurs="unbounded" type="gbt:MIRecordReference"/>
</sequence>
</complexType>
</element>

suds 发送的 SOAP 请求:

<SOAP-ENV:Envelope xmlns:ns0="http://www.grantadesign.com/10/10/GrantaBaseTypes" xmlns:ns1="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns2="http://www.grantadesign.com/10/10/Browse" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Header/>
<ns1:Body>
<ns2:GetRecordAttributes>
<ns2:recordReferences>
<ns0:record>
</ns0:record>
</ns2:recordReferences>
</ns2:GetRecordAttributes>
</ns1:Body>
</SOAP-ENV:Envelope>

问题:<ns2:recordReferences>前缀错误,应该是<ns0:recordReferences>因为它属于命名空间 ...GrantaBaseTypes在 .xsd 中定义。

对于 ref= 定义的所有参数都会发生这种情况在 wsdl 中。如何自动修复?

注意:我通过 curl 手动发送 xml SOAP 请求,检查服务是否接受了“good”前缀。

更新

我干预了 SUDS 源代码,以下经验修复强制所有元素使用 ref=属性假定引用命名空间(以前,它们采用模式根命名空间或任何 tns 是):

文件:/suds/xsd/sxbase.py

class SchemaObject(object):
....
def namespace(self, prefix=None):

ns = self.schema.tns

#FIX BEGIN
if self.ref and self.ref in self.schema.elements.keys():
ns = self.ref
#FIX END

适用于我的服务,但我不确定它是否会破坏其他东西。我更喜欢不更改 SUDS 源代码的更智能的解决方案。

谢谢,

亚历克斯

最佳答案

写一个Suds plugin在发送之前修改 XML。

from suds.client import Client
from suds.plugin import MessagePlugin

class MyPlugin(MessagePlugin):
def marshalled(self, context):
#modify this line to reliably find the "recordReferences" element
context.envelope[1][0][0].setPrefix('ns0')

client = Client(WSDL_URL, plugins=[MyPlugin()])

引用 Suds 文档:

marshalled()
Provides the plugin with the opportunity to inspect/modify the envelope Document before it is sent.

关于python 在 SOAP 请求中产生错误的命名空间前缀,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10207167/

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