Python Suds:如何在请求中获取xsd:timeInstant而不是xsd:date?

0 投票
1 回答
527 浏览
提问于 2025-04-17 05:01

我正在尝试使用一个网络服务,它在请求中需要 xsd:timeInstant(可以在 WSDL 中查看):

<xsd:complexType name="QueryParams">
       <xsd:all>
            <xsd:element name="start" type="xsd:timeInstant" minOccurs="0"/>
            <xsd:element name="stop" type="xsd:timeInstant" minOccurs="0"/>                    
        </xsd:all>
</xsd:complexType>

因此,生成的 SOAP XML 请求应该包含类似这样的内容:

<start xsi:type="xsd:timeInstant">2009-05-10T17:00:00Z</start>
<stop xsi:type="xsd:timeInstant">2009-05-11T17:00:00Z</stop>

我使用 SUDS 创建了以下对象:

qp = client.factory.create("ns0:QueryParams")
qp.start = "2009-05-10T17:00:00Z"
qp.stop = "2009-06-10T17:00:00Z"

不幸的是,SUDS 把这个转换成了 xsd:date,而服务器不接受这个格式。

<query xsi:type="ns3:QueryParams">
    <start xsi:type="ns1:date">2009-05-10T17:00:00Z</start>
    <stop xsi:type="ns1:date">2009-06-10T17:00:00Z</stop>
</query>

有没有什么办法可以强制使用 xsd:timeInstant?

1 个回答

0

我想我找到了问题的解决办法,所以干脆把答案发出来,方便以后参考。

在suds/xsd/sxbuiltin.py这个文件里,有一个叫做Factory的类。

class Factory:

    tags =\
    {
        # any
        'anyType' : XAny,
        ...
        # dates & times
        ...
        'gMonth' : XString,

在gMonth下面,我添加了

'timeInstant' : XString,

现在,WSDL类型xsd:timeInstant可以正确复制了。SOAP请求的XML看起来是这样的:

<query xsi:type="ns3:QueryParams">
    <start xsi:type="ns1:timeInstant">2009-05-10T17:00:00Z</start>
    <stop xsi:type="ns1:timeInstant">2009-06-10T17:00:00Z</stop>
</query>

而且服务器能够处理这个输入。

撰写回答