【问题标题】:"Missing" method attributes when using Suds使用 Suds 时“缺少”方法属性
【发布时间】:2012-02-20 17:16:02
【问题描述】:

我正在使用 Suds 开发 Soap 客户端,但遇到了问题。我创建客户端并打印它以了解可用的方法:

    wsdl_url='http://ws04.iula.upf.edu/soaplab2-axis/typed/services/tokenization.freeling_tokenizer?wsdl'
    FL_ws=Client(wsdl_url)
    print FL_ws

我的输出是(我删除了一些部分以方便阅读):

   Ports (1):
  (freeling_tokenizerPort)
     Methods (11):
        clear(ns2:jobId jobId, )
        describe()
        getLastEvent(ns2:jobId jobId, )
        getResults(ns2:jobId jobId, )
        run(ns1:language language, )
        runAndWaitFor(ns1:language language, )
     Types (22):
        ns1:RunAndWaitFor
        ns1:appInputs
        ns1:appResults
        ns2:describeRequest
        ns2:jobId

请注意,有许多方法缺少属性,例如:runAndWaitFor(ns1:language language, )。根据 WISDL,这个缺失的属性是一个文本,可以作为直接数据或 url 给出:

<xs:complexType name="appInputs">
 <xs:sequence>
  <xs:choice id="input">
   <xs:element name="input_direct_data" type="xs:string"/>
   <xs:element name="input_url" type="xs:string"/>
  </xs:choice>
  <xs:element name="language">
   <xs:simpleType>
    <xs:restriction base="xs:string">
     <xs:enumeration value="en"/>
     <xs:enumeration value="es"/>
    </xs:restriction>
   </xs:simpleType>
  </xs:element>
 </xs:sequence>
</xs:complexType>

然后,我不确定如何调用此方法。在 Perl 中,它可以很好地定义和输入结构,如下所示:

# Inputs structure
my $inputs = {
    input_direct_data => "$input_direct_data",
    language => "$language"
};

所以我尝试了以下方法:

    input = FL_ws.factory.create('ns1:appInputs')
    input['input_direct_data']='The house is red.'
    input['language']='en'
    result=FL_ws.service.runAndWaitFor(input)
    print result

但是Suds生成的xml不正确:

<ns1:Body>
  <ns0:runAndWaitFor>
     <language>
        <input_direct_data>The house is red.</input_direct_data>
        <language>en</language>
     </language>
  </ns0:runAndWaitFor>
</ns1:Body>

因为它将 input_direct_data 放在&lt;language&gt; 下。我发现this 的帖子与 XML 有类似的问题,但他们的解决方案对我不起作用。在我看来,我的问题与 Suds 如何处理选择输入有关,因为它似乎不接受 input_direct_data 作为参数。

我得到的错误总是:

suds.WebFault: Server raised fault: 'Soaplab not able to process the input request: '

所以看来输入没有正确到达服务...

任何关于如何解决这个问题的想法,或者我如何弄清楚 Suds 期望这个输入如何,都会非常有帮助。

非常感谢您的帮助。

【问题讨论】:

    标签: python soap suds


    【解决方案1】:

    我找到了解决办法:

    我使用"typed" wisdl 创建客户端,但由于某种原因,Suds 无法从中正确获取参数。然后,我了解到有另一个"non-typed" wisdl 可用于相同的服务。使用它来创建Suds客户端,它能够正确获取方法的复杂参数,并且我成功构建了客户端。

    我尝试访问的服务是使用 SoapLab 创建的。首先我认为不同WISDL的这个问题与SoapLab如何创建它们有关,但我不是SoapLab的专家,只是这些服务的用户,所以我真的不知道发生了什么......另一方面,我能够使用第一个 wisdl 创建一个 perl 客户端,所以可能是 Suds 的问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-14
      • 2018-11-25
      • 2011-11-11
      • 1970-01-01
      相关资源
      最近更新 更多