我遇到了soaplib的问题。 我有以下由Web服务提供的功能:
@soap(Integer, Integer, _returns=Integer)
def test(self, n1, n2):
return n1 + n2
生成的WSDL文件中数据类型的相应声明是
<xs:complexType name="test">
<xs:sequence>
<xs:element name="n1" type="xs:integer" minOccurs="0" nillable="true"/>
<xs:element name="n2" type="xs:integer" minOccurs="0" nillable="true"/>
</xs:sequence>
</xs:complexType>
<xs:complexType> name="testResponse">
<xs:sequence>
<xs:element name="testResult" type="xs:integer" minOccurs="0" nillable="true"/>
</xs:sequence>
</xs:complexType>
当我使用某个IDE(Visual Studio,PowerBuilder)从该WSDL文件生成代码时,无论IDE如何,它都会为test和testResponse生成两个类,其属性为字符串。
有没有人知道我是否可以调整我的Python声明,以便在客户端避免使用complexType并获得真正的整数数据类型?
答案 0 :(得分:2)
我检查了你的代码,但我得到了相同的输出。我正在使用suds来解析值。
In [3]: from suds import client
In [4]: cl = client.Client('http://localhost:8080/?wsdl')
In [5]: cl.service.test(10,2)
Out[5]: 12
但是当我检查那个值的类型时。
In [6]: type(cl.service.test(10,2))
Out[6]: <class 'suds.sax.text.Text'>
所以SOAPLIB将是返回字符串,但是根据该数据的类型可以转换它。
我通过写这个来检查答案
@soap(_returns=Integer)
def test(self):
return 12
所以我将Firefox响应的SOA客户端插件作为
<?xml version='1.0' encoding='utf-8'?>
<senv:Envelope
xmlns:wsa="http://schemas.xmlsoap.org/ws/2003/03/addressing"
xmlns:plink="http://schemas.xmlsoap.org/ws/2003/05/partner-link/"
xmlns:xop="http://www.w3.org/2004/08/xop/include"
xmlns:senc="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:s12env="http://www.w3.org/2003/05/soap-envelope/"
xmlns:s12enc="http://www.w3.org/2003/05/soap-encoding/"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:senv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/">
<senv:Body>
<tns:testResponse>
<tns:testResult>
12
</tns:testResult>
</tns:testResponse>
</senv:Body>
</senv:Envelope>
从XML中你无法获得原始整数数据。
答案 1 :(得分:1)
好的,并非所有XSD的数据类型都在soaplib中定义。 整数在soaplib中定义,在WSDL文件中看作是一个整数,.NET框架(由PowerBuilder使用)无法理解。 对于.NET / PowerBuilder,Int是可以的,但是soaplib中没有定义soaplib。
因此,我从soaplib转到 rpclib 。这些库非常接近(一个是另一个的分支)。
答案 2 :(得分:0)
与同样的事情作斗争,但无法摆脱肥皂渣。
所以,我用这种方式进行monkeypatch:
from soaplib.serializers.primitive import Integer
class BetterInteger(Integer):
__type_name__ = "int"
Integer = BetterInteger
然后继续生活。
但是,XSD规范定义了'integer':“表示有符号整数。值可以以可选的”+“或” - “符号开头。从十进制数据类型派生。”和'int'“表示范围为[-2,147,483,648,2,147,483,647]的32位有符号整数。源自long数据类型。”
所以,更好的解决方案是:
from soaplib.serializers.primitive import Integer
class Int32(Integer):
__type_name__ = "int"
使用新的“Int32”类输入输入参数。
[soaplib 1.0.0]