1

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 に関係なく、属性がStringsである test と testResponse の 2 つのクラスが生成されます。

クライアント側でcomplexType を回避して実際のInteger データ型を取得できるように、Python 宣言を微調整できるかどうかは誰にもわかりませんか?

4

3 に答える 3

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 から生の整数データを取得することはできません。

于 2011-10-10T10:17:17.697 に答える
1

OK、XSD のすべてのデータ型が soaplib で定義されているわけではありません。整数は soaplib で定義され、WSDL ファイルでは整数として表示されますが、(PowerBuilder で使用される) .NET フレームワークはこれを理解できませんでした。Int は .NET/PowerBuilder では問題ありませんが、soaplib では soaplib が定義されていません。

したがって、soaplib から rpclib に移動しまし。これらのライブラリは非常に近いものです (一方は他方のフォークです)。

于 2011-10-11T09:08:58.780 に答える
0

同じことで戦ったが、soaplibから離れることはできなかった.

だから、私はこのようにそれをモンキーパッチします:

from soaplib.serializers.primitive import Integer

class BetterInteger(Integer):
   __type_name__ = "int"

Integer = BetterInteger

そして、人生を歩んでください。

ただし、XSD 仕様では両方の「整数」が定義されています。および「int」「範囲 [-2,147,483,648, 2,147,483,647] の 32 ビット符号付き整数を表します。long データ型から派生します。」

したがって、より良い解決策は次のとおりです。

from soaplib.serializers.primitive import Integer

class Int32(Integer):
   __type_name__ = "int"

そして、新しい「Int32」クラスを使用して、入力パラメーターを入力します。

[ソープライブラリ 1.0.0]

于 2012-12-13T22:59:14.450 に答える