Неверный (?) Тип данных, созданный с помощью soaplib - PullRequest
1 голос
/ 10 октября 2011

У меня проблема с мылом. У меня есть следующая функция, предоставляемая веб-сервисом:

@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, атрибуты которых Strings .

Кто-нибудь знает, могу ли я настроить декларацию Python, чтобы избежать сложного типа и получить действительный Целочисленный тип данных на стороне клиента?

Ответы [ 3 ]

2 голосов
/ 10 октября 2011

Я проверил ваш код, но я получил тот же вывод. Я использую 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

Итак, я получаю плагин клиента SOA в ответе Firefox как

<?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 голос
/ 11 октября 2011

ОК, не все типы данных XSD определены в soaplib. Целое число определяется в soaplib и рассматривается в файле WSDL как целое число, которое не удалось понять .NET Framework (используется PowerBuilder). Int подходит для .NET / PowerBuilder, но soaplib не определен в soaplib.

Таким образом, я перешел от soaplib к rpclib . Эти либы очень близки (одна вилка другой).

0 голосов
/ 14 декабря 2012

Бились с тем же, но не могли отойти от мыльной пены.

Итак, я установил это следующим образом:

from soaplib.serializers.primitive import Integer

class BetterInteger(Integer):
   __type_name__ = "int"

Integer = BetterInteger

А затем продолжай жить.

Однако спецификация XSD определяет оба целых числа: «Представляет целое число со знаком. Значения могут начинаться с необязательного знака« + »или« - ». Получено из десятичного типа данных. и 'int' "Представляет 32-разрядное целое число со знаком в диапазоне [-2 147 483 648, 2 147 483 647]. Получено из длинного типа данных."

Итак, лучшее решение:

from soaplib.serializers.primitive import Integer

class Int32(Integer):
   __type_name__ = "int"

И используйте ваш новый класс Int32 для ввода ваших входных параметров.

[soaplib 1.0.0]

...