Skip to main content
 首页 » 编程设计

python之"Missing"使用 Suds 时的方法属性

2025年05月04日8txw1958

我正在使用 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 放在 <language> 下.我找到了 this发布与 XML 类似的问题,但他们的解决方案对我不起作用。在我看来,我的问题与 Suds 如何处理选择输入有关,因为它似乎不接受 input_direct_data 作为参数。

我得到的错误总是:

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

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

任何有关如何解决此问题的想法,或者我如何弄清楚 Suds 期望此输入的方式,都将非常有帮助。

非常感谢您的帮助。

请您参考如下方法:

我找到了一个解决方案:

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

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